我正在为我的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
我看过几个例子,找不到我要找的东西。这是可以在正则表达式中完成的,还是我必须将其分解出来?
答案 0 :(得分:4)
OH_\w+
是一个好的开始,但当然\w+
也匹配OH_
,因此您需要从匹配中排除它。这需要使用negative lookahead assertion:
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.
答案 1 :(得分:1)
Tim Pietzcker solution非常出色,但这里有另类选择:
(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
答案 2 :(得分:1)
考虑以下Regex ......
OH_.*?(?=(OH_|\r|\)))