[英]Regex: Trying to match a prefix anywhere in a string multiple times
我正在为我的C#应用程序制作一个正则表达式,并且无法获得我正在寻找的匹配...
问题的关键在于我正在尝试挑选出需要翻译的字符串,并将其替换为国际化的字符串。 正则表达式用于挑选可翻译资源。 我们已经决定在所有可翻译资源前加上“OH_”。将它们背靠背放在一起似乎是正则表达式的问题。 我是否需要声明它们必须至少以空格分隔?
OH_OrderItemStatusChanged
Style1PS1A1OH_OrderItemStatusSpacerOH_OrderItemStatusID_2
(OH_OrderItemSentTo ) (OH_SalesRep )
我的正则表达式是OH_\\w+
它找到以下匹配项:
OH_OrderItemStatusChanged
OH_OrderItemStatusSpacerOH_OrderItemStatusID_2
OH_OrderItemSentTo
OH_SalesRep
第二场比赛实际上应该是两场比赛:
OH_OrderItemStatusSpacer
OH_OrderItemStatusID_2
我看了几个例子,找不到我要找的东西。 这是可以在正则表达式中完成的事情,还是我必须将其解决?
OH_\w+
是一个好的开始,但当然\\w+
也匹配OH_
,所以你需要从匹配中排除。 这需要使用否定的先行断言 :
OH_(?:(?!OH_)\w)+
说明:
OH_ # Match OH_.
(?: # Start of non-capturing group:
(?!OH_) # Assert that we're not at the start of the string OH_,
\w # then match an alnum character.
)+ # Repeat as often as possible.
在regex101上看到它。
Tim Pietzcker的解决方案非常出色,但这里有一个替代方案:
(OH_\w+?)+\b
这将匹配OH_
后跟一个或多个单词字符,非贪婪。 并且它将允许在字符串结束之前捕获该组一次或多次。 这意味着您必须检查Captures
集合以获得所有结果。 例如:
var input = "OH_OrderItemStatusSpacerOH_OrderItemStatusID_2";
var matches = Regex.Matches(input, @"(OH_\w+?)+\b");
foreach(Capture c in matches[0].Groups[1].Captures)
Console.WriteLine(c.Value);
这将产生:
OH_OrderItemStatusSpacer
OH_OrderItemStatusID_2
考虑以下正则表达式......
OH_.*?(?=(OH_|\r|\)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.