我的正则表达式字符串看起来像
您的订单#Q-111-111-1111。账单金额为 $100.50
如何提取订单号,即“#”和第一个“.”之间的字符串
Q-111-111-1111
我试过:
/#(.*[^.])[.].+?/
但它捕获到最后一个点字符。我确定,我需要使用非贪婪匹配,但我无法做到这一点。
最佳答案
您可以简单地使用以下正则表达式:
#(.*?)\.
*
是 greedy - 当您将 ?
附加到 时,它会导致引擎尽可能频繁地重复前面的标记.*
,它将是懒惰的(贪婪的),并且会匹配到第一个点。
为了证明这一点,让我们举个例子:
#(.*)\.
应用于#12-34.234-3.234。 Hello World.*
将首先匹配所有内容,直到字符串结尾(d
字符),然后它会尝试匹配点,但它不存在,所以它会一直回溯直到匹配4
,然后找到点,匹配的字符串是#1234.2343.234
#(.*?)\.
应用于#12-34.234-3.234。 Hello World.*?
只会匹配到4
,然后找到点并匹配,惰性导致它停止搜索更多要消耗的 token
关于regex - 从字符捕获到第一个句点的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28738024/