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

如何在c#中使用正则表达式获取某个特定单词前的数字?,c#,.net,regex,C#,.net,Regex,我们将使用下面的正则表达式来获取单词前的数字 例如: 838123一些单词8一些单词12一些单词 (\d+)\s*someWord 但有时任何东西都会介于数字和单词之间。请参见下面的示例行 例: 43434 someword 12任何someword 2323新someword 如何使用正则表达式获得该单词前的确切数字 请给我你的建议 这样做: (\d+)[^\d]+一些[wW]ord 您需要接受数字本身以外的任何内容。 我还考虑了w和w,因为您的示例包含了这两个方面 假设“任何东西”都不包括数

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

例如:

838123一些单词8一些单词12一些单词

(\d+)\s*someWord


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

例:

43434 someword 12任何someword 2323新someword

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

请给我你的建议

这样做:

(\d+)[^\d]+一些[wW]ord

您需要接受数字本身以外的任何内容。 我还考虑了
w
w
,因为您的示例包含了这两个方面

假设“任何东西”都不包括数字,您可以使用以下正则表达式:

(\d+)[^\d]+someWord

CinCout回答中一个可能的“遗漏角案例”是
someWord
的匹配是否必须精确,例如
notsomeWord
someWordNotThis
不应匹配

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

(\d+[^\d]*[^\w]一些单词[^\w]

解释:
someWord的匹配符之前或之后的
[^\w]
查找它之前和之后的匹配符-此处也计算行尾。当然,这可能会变得更复杂/具体,具体取决于具体的要求


您可以尝试以下方法:

(\d+)\s?([^\d]*)

(\d+)    - get the digits
\s?      - discard a possible space
([^\d]*) - get all chars that are not digits

你可以看到测试

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

例:

43434 someword 12任何someword 2323新someword

试试这个

(\d+)(*?)someword

解释

\d+-数

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

someword-某个词的精确匹配


使用
\s*
只能匹配0个或更多的空白字符

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

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

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

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

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

请参见.NET使用命名匹配捕获(获取数据使用
mtch.Groups[“Value”].Value
…等)以根据需要提取信息

(?<Value>\d+)     -- Get the digits
(?<Other>.+?)     -- Capture all text, but minimal (greedy) capture
(?<Key>someword)  -- til the keyword here.
以下是匹配的内容:


首先用一个模式将
某些[wW]ord
数字
空格
分开,然后在其上执行第二个模式

 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();
var pattern=@“\b(一些[wW]ord.[\d].\s)*\b”;
var rgx=新正则表达式(模式);
var station=“43434 someword 12 anything someword 2323 new someword”;
var result=string.Empty;
foreach(在rgx.Matches中匹配(句子)){
结果+=匹配值;
}
//输出=>结果:43434 someword 12 someword 2323 someword
var patternoncorrectstation=@“\b(\d+)\s*某些[wW]ord*\b”;
var rgxonCorrectSession=新正则表达式(PatternCorrectSession);
var resultoncorrectance=新列表();
foreach(匹配RGXonCorrect语句中的匹配项。匹配项(结果)){
resultoncorrected.Add(match.Value);
}
resultoncorrected.ForEach(Console.WriteLine);
Console.ReadKey();
当第一个模式被执行时,句子将如所需

43434 someword 12任何someword 2323新someword

更改:

43434 someword 12 someword 2323 someword


你在寻找不同的答案吗?@RezaAghaei Maybee你提供的当前答案有什么问题?你在寻求什么样的改进?@RezaAghaei OP还没有接受任何答案这一事实让我想,如果我错过了一个角落的案子或什么的话。也欢迎使用其他方法来解决此问题。@CinCout,请查看可能的边缘缺失案例(不确定这是否与OP相关)。现有帖子似乎回答了您的问题。如果你觉得答案有用,请让回答者和未来的读者知道。否则,请提供更多详细信息,说明你在寻找什么,以及为什么答案不适合你的情况。不清楚你在问什么。。。
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
 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();