繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM