1

如何匹配这样的字符串:

firstword [foo = bar]

firstword

使用 1 个正则表达式。

我尝试过的是(\w+)[\s]{0,1}\[(.+)\],我只能匹配第一个,我还尝试\[(.+)\][]*to包裹最后一个,[\[(.+)\]]*现在我无法匹配方括号内的空格和“=”。

大佬能给个提示吗?

4

3 回答 3

3

似乎最后一部分只是可选的:

(\w+)\s?(?:\[([^\]]+)\])?

(?: ... )?是一个可选部分,不执行内存捕获。

如果可选部分也意味着总会有一个空间,你也可以移动\s里面:

(\w+)(?:\s\[([^\]]+)\])?
于 2013-06-13T10:57:51.810 回答
0

您可以使用非 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.

于 2013-06-13T11:06:20.377 回答
0
(\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)
于 2013-06-13T11:06:07.157 回答