正则表达式如何匹配包含方括号的字符串

时间:2013-06-13 10:52:44

标签: regex

如何匹配这样的字符串:

firstword [foo = bar]

firstword

使用1个正则表达式。

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

你们可以提一下吗?

3 个答案:

答案 0 :(得分:3)

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

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

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

如果可选部分也意味着总是有空格,您也可以移动\s内部:

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

答案 1 :(得分: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)

答案 2 :(得分: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