我有一个正则表达式,它捕获一个数字符号之后的关键字:
/^#\s*([a-zA-Z\-\s]+)/
但是,我需要更改正则表达式以指定不匹配包含星号的字符串。例如,我需要正则表达式来匹配# keyword
,但不是 # *keyword
。
以下是我解决此问题的最佳尝试:
/^#\s[^[*]]*([a-zA-Z\-\s]+)/
我是 Perl 的新手,所以我确信解决方案非常简单,但是我花在研究和反复试验上的时间并没有帮助我很多。
我有一个正则表达式,它捕获一个数字符号之后的关键字:
/^#\s*([a-zA-Z\-\s]+)/
但是,我需要更改正则表达式以指定不匹配包含星号的字符串。例如,我需要正则表达式来匹配# keyword
,但不是 # *keyword
。
以下是我解决此问题的最佳尝试:
/^#\s[^[*]]*([a-zA-Z\-\s]+)/
我是 Perl 的新手,所以我确信解决方案非常简单,但是我花在研究和反复试验上的时间并没有帮助我很多。
假设我理解正确,你的第一个正则表达式很好。由于它是一个白名单并且星号字符不在其中,因此它不会匹配包含星号字符的关键字:
/^#\s*([a-zA-Z\-\s]+)/
这仍将匹配以下内容:
# key*word
...虽然只会key
匹配。一种解决方案是,如果您确定只有关键字将占用该行的其余部分,则将强制只出现在白名单中的字符直到行尾,如下所示:
/^#\s*([a-zA-Z\-\s]+)$/
这是另一种选择。如果您只想确保初始哈希和空格之后的第一组字符不包含星号,您可以使用:
/^#\s*([a-zA-Z\-]+)(?:\s|$)/
这将匹配:
# keyword foo
它将匹配:
# keyword
但它不会匹配:
# key*word foo
也不:
# key*word
也不:
# key* word foo
也不:
# **** keyword
我认为问题是您部分匹配带有星号的字符串,如下所示:
foobar* => matching string "foobar"
您可能会尝试使用否定的前瞻断言,如下所示:
/^#\s*(?!.*\*)(.+)/
这.*\*
断言在英镑符号前面的任何地方都没有出现星号。然而,这只是一种将两件事合二为一的奇特方式:
if (!/\*/ && /^#\s*(.+)/) { ...
尝试使用此正则表达式进行匹配:
^#\s*([-a-zA-Z]+)(?=\s|$)
您的正则表达式已经不匹配# *keyword
,但是这个正则表达式从捕获的组中删除了空格并使用前瞻来断言单词后面的字符不是星号,因此它不会匹配# key*word
。
另请注意,当它是字符类中的第一个(或最后一个)字符时,不必转义破折号的这种轻微简化。
在 rubular 上查看这个的现场演示。