2024-04-27 11:16:04 发布
网友
这是一个示例字符串:
123456#p654321
目前,我使用此匹配将123456和654321捕获到两个不同的组中:
123456
654321
([0-9].*)#p([0-9].*)
但有时,字符串的#p654321部分不在那里,所以我只想捕获第一个组。我试图通过在第二个组后面附加?使其成为“可选”组,这是有效的,但前提是在剩余字符串的末尾有一个#p。
#p654321
?
#p
解决这个问题的最好办法是什么?
您拥有捕获组之外的#p,这使得它成为结果的必需部分。您还未正确使用点字符(.)。点(在大多数reg ex变体中)将匹配任何字符。更改为:
.
([0-9]*)(?:#p([0-9]*))?
(?:)语法是获取非捕获组的方式。然后我们只捕获你感兴趣的数字。最后,我们让整件事都是可选的。
(?:)
而且,大多数reg-ex变体都有一个\d字符类。所以你可以进一步简化:
\d
(\d*)(?:#p(\d*))?
正如另一个人指出的,*运算符可能与zero数字匹配。要防止这种情况,请改用+运算符:
*
+
(\d+)(?:#p(\d+))?
您的regex实际上将匹配no数字,因为您使用了*,而不是+。 这就是(我想)你想要的:
您拥有捕获组之外的
#p
,这使得它成为结果的必需部分。您还未正确使用点字符(.
)。点(在大多数reg ex变体中)将匹配任何字符。更改为:(?:)
语法是获取非捕获组的方式。然后我们只捕获你感兴趣的数字。最后,我们让整件事都是可选的。而且,大多数reg-ex变体都有一个
\d
字符类。所以你可以进一步简化:正如另一个人指出的,
*
运算符可能与zero数字匹配。要防止这种情况,请改用+
运算符:您的regex实际上将匹配no数字,因为您使用了
*
,而不是+
。这就是(我想)你想要的:
相关问题 更多 >
编程相关推荐