1

次のパターンに準拠する文字列があります。

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

ここで、 は任意の数のcc文字、nrは任意の数の数字、M は実際の文字Mです。

例えば:

ASF-1.15M437979CA 100000
EU-12.15M121515PO 1145

文字列内の-.の位置を見つける必要があります。M問題は、先頭の文字と末尾の文字にも文字を含めることができることですがM、必要なのは真ん中の文字だけです。

別の方法として、最初の文字 ( まで-) と最初の 2 つの数字 ( のように(nr).(nr)M...) を減算するだけで十分です。

4

2 に答える 2

0

正規表現:

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;
}
于 2015-05-18T12:05:13.117 に答える
0

正規表現ベースのソリューションが必要な場合は、必要なパターンの周りに 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]
于 2015-05-18T12:04:09.277 に答える