【问题标题】:RegexPattern not working while matching words in C#RegexPattern 在 C# 中匹配单词时不起作用
【发布时间】:2022-10-16 07:50:49
【问题描述】:

我必须将字符串与值列表匹配,并找出匹配的值。

值列表

USD
U S D
U/S/D
UNITED STATES DOLLARS

我使用了下面的模式。

(U|UNITED)(.)?(\s)?(S|STATES)(.)?(\s)?(D|DOLLARS)(.)?

我还使用Regex.Matches 来确定匹配字符串的值。

它适用于以下字符串,除非 testdata 具有 UNITEDSTATESDOLLARS.

regex.matches 只返回美国. 缺少 DOLLARS 的几个字母。 如何修复正则表达式以检索所有匹配的单词UNITEDSTATESDOLLARS

Test data Output value
testUSD USD
testU.S.D U.S.D
testU/S/D U/S/D
testUNITEDSTATESDOLLARS UNITEDSTATESDO**

https://regex101.com/r/g7gh8a/1

【问题讨论】:

  • 这里有两个问题。首先,正则表达式将尝试首先匹配左侧的内容,因此如果您希望在出现时匹配 DOLLARS 而不仅仅是字母 D 和后面的字母,您应该将 DOLLARS 放在组中的第一位.其次,除非您使用不区分大小写的标志,否则Dollars 将不匹配DOLLARS。确保您使用不区分大小写标志或更改它在模式中查找的内容。
  • 谢谢。更新了模式。模式中的措辞区分大小写。
  • 我想你的意思是 \. 不是 . 因为 . 匹配任何字符但是\. 匹配一个句点。否则,您的表达式将匹配 UPSIDE 之类的内容。另外,我认为您想要(DOLLARS|D),而不是(D|DOLLARS),因此它更喜欢先匹配较长的单词。
  • 将 DOLLARS 更改为首先匹配并添加 \.最后解决了我的问题。“(U|UNITED)(.)?(\s)?(S|STATES)(.)?(\s)?(DOLLARS|D)(\.)?”非常感谢

标签: c#


【解决方案1】:

我尝试对您的正则表达式进行最小的更改:

var inputs = new []
{
    "testUSD",
    "testU S D",
    "testU/S/D",
    "testUNITED STATES DOLLARS",
};

var regex = new Regex(@"(U(NITED|)(.)?(s)?S(TATES|)(.)?(s)?D(OLLARS|)(.)?)");

Console.WriteLine(
    String.Join(Environment.NewLine,
        inputs.Select(i => regex.Match(i).Value)));

基本上我改变了你接受的比赛的顺序。所以,我选择了(UNITED|U),而不是(U|UNITED)。我将其稍微更改为U(NITED|) 以消除冗余——这可能是也可能不是改进。

【讨论】:

  • 也可以U(NITED)?
  • @juharr - 不,你不能。这只会匹配UNITED
  • 是的,您可以,因为美元符号意味着它将匹配 U 后跟可选的“NITED”
  • @juharr - 对不起,你是对的。我认为问号? 是您提出的问题,而不是您建议的Regex 的一部分。
【解决方案2】:

试试这个正则表达式模式:

^.*((USD)|(U[.|/|s]*S[.|/|s]*D)|(UNITEDs*STATESs*DOLLARS)).*$

我在控制台应用程序中尝试了上面的正则表达式模式,它工作正常!见下文 :

代码:

结果 :

【讨论】:

  • 谢谢 。当我试图检索匹配的值时(例如 testUSD 应该返回 USD , testU.S.D 应该返回 U.S.D),你提到的模式不起作用。
猜你喜欢
  • 2012-03-28
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 2013-04-24
  • 1970-01-01
相关资源
最近更新 更多