我在尝试应用以下正则表达式时遇到问题:
(1234).*?(abcd)?
到下面的字符串:
1234567abcd
我的期望是上面应该产生两个匹配项:
- 1234
- abcd
但是,这不起作用。您可能会建议“好吧,只需删除尾随的 ?
字符吗?” -- 但我希望第二个模式是可选的。
这是怎么做到的?
重申一下:
(1234).*?(abcd)
... 给出了想要的结果,但我搜索的字符串并不总是包含 abcd
。
如果有人想知道,这是大局问题的简化示例。如果需要,我会解释。
====
我认为这个问题需要进一步澄清。这是我正在尝试用 ruby 做的更完整的示例。
根据我的日志文件中的以下两行“篡改”行:
Aug 28 00:00:05 app-system-1 app-prod[7660]: Completed 200 OK in 150ms (Views: 24.6ms | ActiveRecord: 66.1ms)
Aug 28 00:05:06 app-system-1 app-prod[10639]: Completed 302 Found in 81ms (ActiveRecord: 74.6ms)
我试过用 ruby 编译正则表达式如下:
d=Regexp.new('(?<timestamp>\w{1,3}\s\d{1,2}\s\d\d:\d\d:\d\d).*(?<in>in [0-9]*).*(?<views>Views: [0-9]*).*(?<activerecord>ActiveRecord: [0-9]*)')
很明显,在某些情况下,“views”文本将被包含,在其他行中,它不存在。
我希望能够做这样的事情:
v=d.match(line)
if !v.nil?
puts v[:timestamp]+ " " + v[:in] + " " + v[:views] + " " + v[:activerecord]
这显然是一个不完整的例子,但希望这能澄清。
最佳答案
你没有具体说明你想要什么,至少没有明确说明,但我认为你想要以下内容:
- 当给定
...1234567abcd...
作为输入时,1234567abcd
应该匹配,并且1234
和abcd
应该被捕获。 - 当给定
...1234567abce...
作为输入时,应该匹配1234
,应该捕获1234
。
如果是这样,您可以使用:
/(1234)(?:.*?(abcd))?/s
我讨厌使用贪婪修饰符。它用于避免匹配某些序列,但不能保证它不会。我会改用以下内容:
/
(1234)
(?:
(?:(?!abcd).)* # Safer than .*?
(abcd)
)?
/sx
关于python - 正则表达式可选匹配运算符 : how to apply to a string of characters?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12208049/