【问题标题】:Why is Regex giving me the who start of the string [duplicate]为什么正则表达式给我字符串的开头[重复]
【发布时间】:2019-09-05 13:40:33
【问题描述】:

我正在编写一个通用的冒烟测试我需要在每个页面标题中提取版本号,以便我可以将它与结果一起记录,但是,由于某种原因,我的正则表达式带出了整个字符串的开头(包括它应该在之后开始的模式。

string title = "Random text RECOGNITIONPATTERN 9.0 (ENVIRONMENT)" ;
string searchstr= ".*RECOGNITIONPATTERN (.*) ";
Regex reg = new Regex(searchstr, RegexOptions.IgnoreCase); 
string result = reg.Match(title).Groups[0].ToString();

我希望结果等于“9.0”,但是,我实际得到的是“随机文本识别模式 9.0”

任何想法

【问题讨论】:

  • Groups[0] 返回整个匹配项。为您的实际捕获组尝试Groups[1]
  • 谢谢你的作品。但是为什么当语言的其余部分从零开始时有一个不是:|
  • 这并不是说“它不是基于 0”,因为有一个 Groups[0] 所以 c# 仍然是基于 0 的,这只是“索引 0 包含整个输入字符串”的实现规则。大多数正则表达式引擎都具有此功能。请参阅我的答案,并使用命名的捕获组。旁注,在用于编写 excel 文件的 EPPlus 库中,索引从 1 开始,因为这是 excel 表的开始。作者做了一个实现决定,“1 应该指第一行”,但他的选择并不意味着 c# 不再是从 0 开始的,他只是选择它,因为 Excel 将第一行编号为 1

标签: c# regex


【解决方案1】:

因为默认情况下在匹配中,Groups[0] 包含整个输入字符串。改为访问Groups[1],或者更好地为您的捕获组命名:

string title = "Random text RECOGNITIONPATTERN 9.0 (ENVIRONMENT)" ;
string searchstr= "RECOGNITIONPATTERN (?<v>[0-9.]+)";
Regex reg = new Regex(searchstr, RegexOptions.IgnoreCase); 
string result = reg.Match(title).Groups["v"].ToString();

您也不需要在模式开头使用 .*,如果可能的话,我建议您比 .* 更准确地定义要捕获的字符 -> 您需要版本号,因此请考虑[0-9.]+ 是“0-9 或 . 中的一个或多个”。甚至可以考虑\d+[.]\d+

【讨论】:

  • @Big Ian:小心.* 模式;例如如果是"Random text RECOGNITIONPATTERN 9.0 (ENVIRONMENT) and more";,你会得到"9.0 (ENVIRONMENT) and"。要么使用更具体匹配(?&lt;v&gt;[0-9.]+)或至少使用.*?模式 - 尽可能匹配few
  • 为了更安全的模式而不是.* +1
  • @DmitryBychenko 确实.. 他的.* 仅在版本号之后停止,这要归功于他的模式中的尾随空格.. 但是如果字符串的其余部分有空格,那将是一个由于量词的贪婪问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
  • 1970-01-01
  • 2011-09-16
相关资源
最近更新 更多