我正在尝试为以下行编写正则表达式:
Funds Disb ABC Corp nmnxcb /abdsd= 12345678912345 abcdef
并将数字检索到命名组中。我为上面创建了一个正则表达式:
^Funds Disb ABC Corp.*\s+(?<SOMEID>\d+).*$
问题是如果数字(上例中的12345678912345)不在行中,它将与我的行不匹配。我已经尝试将其更改为下面的内容(在组之后添加&#39;?&#39;因此它会期望命名组的0或1个实例,但在更改之后它会停止将该数字作为命名组完全读取。
^Funds Disb ABC Corp.*\s+(?<SOMEID>\d+)?.*$
答案 0 :(得分:2)
^Funds Disb ABC Corp.*\s+(?<SOMEID>\d+)?.*$
的问题在于,第一个.*
最初将占用该行的其余部分,包括所有数字。它必须回溯一点,以满足\s+
,但它不会回溯到足以找到数字 - 毕竟,你告诉它数字是完全可选的。
要解决此问题,您需要确保正则表达式永远不会在您想要匹配的实际组之前跳过任何数字:[^\d]*
而不是.*
。所以请尝试:^Funds Disb ABC Corp[^\d]*\s+(?<SOMEID>\d+)?.*$