3

Considering

NN = number/digit
x = any single letter

I want to match these patterns:

1. NN
2. NNx
3. NN.NN
4. NN.NNx
5. NN.NN.NN
6. NN.NN.NNx

Example that needs to be match:

1. 20
2. 20a
3. 20.20
4. 20.20a
5. 20.20.20
6. 20.20.20a

Right now I am trying to use this regex:

\b\d+\.?\d+\.?\d+?[a-z]?\b

But if fails.

Any help would be greatly appreciate, thanks! XD

EDIT:

I am matching this:

<fn:footnote fr="10.23.20a">    (Just a sample)

Now I have a regex that will extract the '10.23.20a'

Now I will check if this value will be valid, the 6 examples above will be the only string that will be accepted.

This examples are invalid:

1. 20.a
2. 20a.20.20
3. etc.

Many thanks for your help men! :D

4

2 に答える 2

1

\d+1 つ以上の数字である が常にあります。したがって、少なくとも 3 桁が必要です。数字をピリオドでグループ化してみてください。

^\d+(?:[.]\d+){0,2}[a-z]?$

は、キャプチャ?:を抑制する単なる最適化 (および良い方法) です。とは完全に互換性がありますが、私は前者の読みやすさを好みます。あなたが一番好きなものを選んでください。[.]\.

実際に数字と文字をキャプチャしたい場合は、次の 2 つのオプションがあります。

^(?<first>\d+)(?:[.](?<second>\d+))?(?:[.](?<third>\d+))?(?<letter>[a-z])?$

重要な点は、ピリオドと数字をグループ化し、一緒にオプションにすることです。名前のないグループを使用することもできますが、それは問題ではありません。ただし、私のバージョンを使用すると、(たとえば)からパーツにアクセスできるようになりました

match.Groups["first"].Value

たとえば、またはによって返さmatchれるMatchオブジェクトです。Regex.MatchRegex.Matches

または、1 つのグループで複数の値をキャプチャする .NET の機能を使用できます。

^(?<d>\d+)(?:[.](?<d>\d+){0,2}(?<letter>[a-z])?$

match.Groups["d"].Capturesキャプチャされたすべての番号 (1 ~ 3) のリストが含まれます。そしてmatch.Groups["letter"].Value、そこにあった場合でも、手紙が含まれます。

于 2012-12-18T09:03:55.047 に答える
0

これを試して

^\d+(?:(?:\.\d+)*[a-z]?)$
于 2012-12-18T09:47:57.517 に答える