正则表达式:尝试多次匹配字符串中的任何位置前缀

时间:2013-11-07 20:46:10

标签: c# regex

我正在为我的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

我看过几个例子,找不到我要找的东西。这是可以在正则表达式中完成的,还是我必须将其分解出来?

3 个答案:

答案 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.

on regex101

答案 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|\)))