如何匹配这样的字符串:
firstword [foo = bar]
和
firstword
使用 1 个正则表达式。
我尝试过的是(\w+)[\s]{0,1}\[(.+)\]
,我只能匹配第一个,我还尝试\[(.+)\]
用[]*
to包裹最后一个,[\[(.+)\]]*
现在我无法匹配方括号内的空格和“=”。
大佬能给个提示吗?
如何匹配这样的字符串:
firstword [foo = bar]
和
firstword
使用 1 个正则表达式。
我尝试过的是(\w+)[\s]{0,1}\[(.+)\]
,我只能匹配第一个,我还尝试\[(.+)\]
用[]*
to包裹最后一个,[\[(.+)\]]*
现在我无法匹配方括号内的空格和“=”。
大佬能给个提示吗?
似乎最后一部分只是可选的:
(\w+)\s?(?:\[([^\]]+)\])?
这(?: ... )?
是一个可选部分,不执行内存捕获。
如果可选部分也意味着总会有一个空间,你也可以移动\s
里面:
(\w+)(?:\s\[([^\]]+)\])?
您可以使用非 qreedy 量词。在 Perl 扩展符号中:
s/ ^ # Beginning of string. You might not need this.
(\w+) # Capture a word.
\s* # Optional spaces.
(?: # Non-capturing group.
\[ # Literal bracket.
.*? # Any number of characters, but as few as possible,
# so stopping before:
\] # Literal bracket
)? # End the group, and make it optional as requested.
/
$1 # The captured word.
/x # Allow the extended notation.
根据需要进行修改。一些引擎使用\1
而不是$1
.
(\w+)\s*(\[.+?\])?
在 Python 交互式 shell 中测试:
>>> re.match(r'(\w+)\s*(\[.+?\])?', 'firstword [foo = bar]').groups()
('firstword', '[foo = bar]')
>>> re.match(r'(\w+)\s*(\[.+?\])?', 'firstword [foo = bar').groups()
('firstword', None)
>>> re.match(r'(\w+)\s*(\[.+?\])?', 'firstword foo = bar').groups()
('firstword', None)
>>> re.match(r'(\w+)\s*(\[.+?\])?', 'firstword foo = bar]').groups()
('firstword', None)
>>> re.match(r'(\w+)\s*(\[.+?\])?', 'firstword').groups()
('firstword', None)