正则表达式查找字符串中不同字符的位置

Regexp find position of different characters in string

我有一个符合以下模式的字符串:

(cc)-(nr).(nr)M(nr)(cc)whitespace(nr)

其中cc是任意数量的字母字符,nr是任意数量的数字字符,M是实际的字母M.

例如:

ASF-1.15M437979CA 100000
EU-12.15M121515PO 1145

我需要找到 -.M 在字符串中的位置。问题是,前导字符和结束字符也可以包含字母 M,但我只需要中间的那个。

作为替代方案,减去第一个字符(直到 -)和前两个数字(如 (nr).(nr)M...)就足够了。

如果您需要基于正则表达式的解决方案,您只需围绕所需的模式使用 3 个捕获组,然后访问 Groups[n].Index 属性:

var rxt = new Regex(@"\p{L}*(-)\d+(\.)\d+(M)\d+\p{L}*\s*\d+");
// Collect matches
var matches = rxt.Matches(@"ASF-1.15M437979CA 100000  or  EU-12.15M121515PO 1145");
// Now, we can get the indices
var posOfHyphen = matches.Cast<Match>().Select(p => p.Groups[1].Index);
var posOfDot = matches.Cast<Match>().Select(p => p.Groups[2].Index);
var posOfM = matches.Cast<Match>().Select(p => p.Groups[3].Index);

输出:

posOfHyphen => [3, 32]
posOfDot    => [5, 35]
posOfM      => [8, 38]

正则表达式:

string pattern = @"[A-Z]+(-)\d+(\.)\d+(M)\d+[A-Z]+";
string value = "ASF-1.15M437979CA 100000  or  EU-12.15M121515PO 1145";

var match = Regex.Match(value, pattern);

if (match.Success)
{
    int sep1 = match.Groups[1].Index;
    int sep2 = match.Groups[2].Index;
    int sep3 = match.Groups[3].Index;
}