如何在C#中使用正则表达式获取某些特定单词之前的数字?


10

我们将使用下面的正则表达式来获取单词之前的数字。

范例:

838123 someWord 8 someWord 12 someWord

(\d+)\s*someWord

但是有时数字和单词之间会出现任何东西。请参见下面的示例行。

例如:

someword 12的43434 someword 2323 new someword

如何使用正则表达式获取该单词之前的确切数字?

请给我您的建议。


3
现有帖子似乎可以回答您的问题。如果您认为答案有用,请告知答题者和将来的读者(浏览)。否则,请提供有关您正在寻找的内容以及答案为何不适合您情况的更多详细信息。
雷扎Aghaei

1
不清楚您要问的是什么...
JohnyL

Answers:


14

做这个:

(\d+)[^\d]+some[wW]ord

您需要接受数字本身以外的任何东西。我也考虑了两者wW因为您的示例包含了两者。

演示版


您在寻找其他答案吗?
Reza Aghaei

@RezaAghaei也许
CinCout

您提供的当前答案有什么问题?您在寻找什么改进?
Reza Aghaei

@RezaAghaei OP还没有接受任何答案的事实让我想起是否想念一个极端的情况。也欢迎使用其他方法来解决它。
CinCout

1
@ CinCout-ReinstateMonica请参阅我的答案以了解可能丢失的边缘情况(不确定这是否与OP相关)。
史蒂夫·钱伯斯


3

一种可能“错过角落情况下”从CinCout的回答是,如果匹配someWord必须的,如果是准确的,比如notsomeWordsomeWordNotThis不应该匹配。

该正则表达式的以下扩展提供了解决此问题的方法:

(\d+)[^\d]*[^\w]some[wW]ord[^\w]

说明:[^\w]之前或匹配了之后someWord的样子了“非单词字符”之前和之后-该行的结束也算在这里。当然,这可以变得更复杂/更具体,这取决于确切的要求。

演示版



3

第一分离的some[wW]ordnumberspace带有图案,然后执行在其上的第二图案

 var pattern = @"\b(some[wW]ord|[\d]|\s)*\b";
 var rgx = new Regex(pattern);
 var sentence = "43434 of someword 12 anything someword 2323 new someword";
 var result = string.Empty;
 foreach (Match match in rgx.Matches(sentence)){
     result += match.Value;
}
//output => result: 43434 someword 12 someword 2323 someword

 var patternOnCorrectSentence = @"\b(\d+)\s*some[wW]ord*\b";
 var rgxOnCorrectSentence = new Regex(patternOnCorrectSentence);

 var resultOnCorrectSentence = new List<string>();
 foreach (Match match in rgxOnCorrectSentence.Matches(result)){
     resultOnCorrectSentence.Add(match.Value);
 }
 resultOnCorrectSentence.ForEach(Console.WriteLine);

 Console.ReadKey();

当执行第一个模式时,该句子将是所需的

someword 12的43434 someword 2323 new someword

更改:

43434某个单词12某个单词2323某个单词


2

但是有时数字和单词之间会出现任何东西。请参见下面的示例行。

例如:

someword 12的43434 someword 2323 new someword

尝试这个

(\ d +)(。*?)

解释

\ d +-数字

。*?-数字之后的任何数字,但出现次数最少。

someword-完全匹配

演示版


2

使用\s*将仅匹配0个或多个空白字符。

您可以使用,\D+但它也会匹配换行符,因为它匹配除数字以外的任何字符。

如果要匹配同一行上的数字,则可以将不匹配换行符的字符添加到否定的字符类中 [^\d\r\n]

在您的示例中,您使用\d,但是如果您只想匹配1或多个数字0-9,则可以使用字符类[0-9]+

为了防止数字和单词成为较大单词的一部分,可以使用单词边界 \b

如果要以不区分大小写的方式匹配单词,可以使用RegexOptions.IgnoreCase或内联修饰符(?i)

(?i)\b([0-9]+)\b[^\d\r\n]*\bsomeword\b

观看.NET 正则表达式演示


2

使用命名匹配捕获(要获取数据,请使用mtch.Groups["Value"].Value...等)以根据需要提取信息。

(?<Value>\d+)     -- Get the digits
(?<Other>.+?)     -- Capture all text, but minimal (greedy) capture
(?<Key>someword)  -- til the keyword here.

当上述运行(IgnorePatternWhiteSpace以其它方式去除的评论和加入模式运行它如(?<Value>\d+)(?<Other>.+?)(?<Key>someword)不带正则表达式的选项)它获取的数据对每个数据/密钥对,并组织在每个单个的匹配。

结果

这是结果(对于第二个示例),所有结果都包含在单个匹配项中,并且每个匹配项中都包含它们的组和捕获:

Match #0
              [0]:  43434˽of˽someword
  ["Value"]  [1]:  43434
      1 Captures:  43434
  ["Other"]  [2]:  ˽of˽
      2 Captures:  ˽of˽
    ["Key"]  [3]:  someword
      3 Captures:  someword
Match #1
              [0]:  12˽anything˽someword
  ["Value"]  [1]:  12
      1 Captures:  12
  ["Other"]  [2]:  ˽anything˽
      2 Captures:  ˽anything˽
    ["Key"]  [3]:  someword
      3 Captures:  someword
Match #2
              [0]:  2323˽new˽someword
  ["Value"]  [1]:  2323
      1 Captures:  2323
  ["Other"]  [2]:  ˽new˽
      2 Captures:  ˽new˽
    ["Key"]  [3]:  someword
  3 Captures:  someword

视觉上这是匹配的内容:

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.