这感觉像是一个非常简单的问题,但我在任何地方都找不到答案。
(注意:我使用的是 Python,但这无关紧要。)
假设我有以下字符串:
s = "foo\nbar\nfood\nfoo"
我只是试图找到一个正则表达式,它将匹配“foo”的两个实例,但不匹配“food”,基于“food”中的“foo”不是紧跟换行符或结尾的事实细绳。
这可能是表达我的问题的一种过于复杂的方式,但它提供了一些具体的东西。
以下是我尝试过的一些事情,有结果(注意:我想要的结果是 [ foo\n
, foo
]):
foo[\n\Z]
=> [ 'foo\n'
]
foo(\n\Z)
=> [ '\n'
, ''
] <= 这似乎与换行符和 EOS 匹配,但不是foo
foo($|\n)
=> [ '\n'
, ''
]
(foo)($|\n)
=> [( foo
, '\n'
), ( foo
, ''
)] <= 差不多了,这是一个可用的 B 计划,但我想找到完美的解决方案。
我发现唯一有效的是:
foo$|foo\n
=> [ 'foo\n'
, `'foo']
对于这样一个简单的例子来说这很好,但是很容易看出它是如何使用更大的表达式变得笨拙的(是的,这个foo
东西是我实际使用的更大表达式的替代品)。
有趣的是:我能找到的最接近我的问题的 SO 问题是这个:在正则表达式中,匹配字符串的结尾或特定字符
在这里,我可以简单地替换\n
我的“特定角色”。现在,接受的答案使用 regex /(&|\?)list=.*?(&|$)/
。我注意到 OP 正在使用 JavaScript(问题被标记为javascript
标签),所以 JavaScript 正则表达式解释器可能不同,但是当我在 Python 中使用上述正则表达式的问题中给出的确切字符串时,我得到了不好的结果:
>>> findall("(&|\?)list=.*?(&|$)", "index.php?test=1&list=UL")
[('&', '')]
>>> findall("(&|\?)list=.*?(&|$)", "index.php?list=UL&more=1")
[('?', '&')]
所以,我很难过。