如何在c#中使用正则表达式获取某个特定单词前的数字?
我们将使用下面的正则表达式来获取单词前的数字 例如: 838123一些单词8一些单词12一些单词如何在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,因为您的示例包含了这两个方面 假设“任何东西”都不包括数
(\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();