【问题标题】:C# regex for specific character or nothing特定字符的 C# 正则表达式或什么都没有
【发布时间】:2015-02-26 11:13:27
【问题描述】:

短版: 如何在更长的、可能重复的模式中匹配单个特定字符或什么都不匹配?

加长版: 我正在形成一个正则表达式来计算字符串'word'在具有特定格式的字符串中的出现; 一个连字符后跟一个整数(任意长度),然后是一个连字符,后跟一个字符串“word”,然后是一个连字符,可能会重复。 例如

'-0-word-'(1 个匹配项)
'-10-word-'(1 个匹配项)
'-999-word-'(1 个匹配项)
'-1-word-1-word-'(2 个匹配项)
'-1-word-1-word-222-word-' (3 个匹配项)等

如果模式重复,那么我认为前导连字符必须是可选的,因为它已经是前一个匹配的尾随连字符。

到目前为止,我想出的最好的是;

[-]?\d+-word-

给出 3 个匹配项

'-1-word-1-word-222-word-'

但它也提供了 3 个匹配项

'-1-word-1-word-X222-word-'

因为前导连字符是可选的,并且“X”被忽略。我希望前导连字符只是一个连字符或什么都没有。如果格式不正确,我想确保整个字符串被拒绝(不匹配)。

感谢您的帮助!

【问题讨论】:

  • 以上是准确的输入吗?
  • ' 不是匹配项或字符串的一部分。只是写字符串时的习惯!谢谢。

标签: c# regex


【解决方案1】:
^-\d+-word(?:-\d+-word)*-$

试试这个。查看演示。

https://regex101.com/r/wU7sQ0/20

【讨论】:

  • 谢谢。这验证了字符串 ok 但只给出了一个匹配项。我想我可以先使用它,然后使用 [-]?\d+-word- 来获取计数。
【解决方案2】:

如果要同时统计出现次数和检查字符串格式,可以这样做:

String input = "-1-word-1-word-222-word-";
String pattern = @"\A(-[0-9]+-word)+-\z";

Match m = Regex.Match(input, pattern);

if (m.Success) {
    Console.WriteLine(m.Groups[1].Captures.Count);
}

当您重复捕获组时,会存储每个捕获,您可以使用Captures 属性访问它们。

【讨论】:

  • 谢谢,我会采用这种方法的。
【解决方案3】:

请尝试此正则表达式演示以了解单词出现次数。

模式为“-\d+-word(-\d+-word)*-”

http://regexr.com/3agkb

【讨论】:

猜你喜欢
  • 2020-07-30
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 2023-03-31
  • 2012-10-03
  • 2021-08-08
相关资源
最近更新 更多