3

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

我查看了几个示例,但找不到我要查找的内容。这是可以在正则表达式中完成的事情,还是我必须打破它?

4

3 回答 3

4
OH_\w+

是一个好的开始,但当然\w+也 match 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 上查看。

于 2013-11-07T20:49:37.457 回答
1

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

于 2013-11-07T20:59:15.897 回答
1

考虑以下正则表达式...

OH_.*?(?=(OH_|\r|\)))
于 2013-11-07T20:59:52.427 回答