0

検証したいテキスト文字列は、私が「セグメント」と呼んでいるもので構成されています。単一のセグメントは次のようになります。

 [A-Z,S,3]

これまでのところ、この正規表現パターンを構築することができました

(?:\[(?<segment>[^,\]\[}' ]+?,[S|D],\d{1})\])+?

動作しますが、テキスト文字列全体に無効なテキストが含まれていても、一致が返されます。^パターンのどこかで使用する必要があると思います$が、方法がわかりません!?

私のパターンで次の結果が得られるようにしたいと思います。

  • [A-Z,S,3][A-Za-z0-9åäöÅÄÖ,D,4] OK(2つのセグメント)
  • [A-Z,S,3]aaaa[A-Za-z0-9åäöÅÄÖ,D,4] 歯が立たない
  • crap[A-Z,S,3][A-Za-z0-9åäöÅÄÖ,D,4] 歯が立たない
  • [A-Z,S,3][] 歯が立たない
  • [A-Z,S,3][klm,D,4][0-9,S,1] OK(3つのセグメント)
4

2 に答える 2

3

^ を使用して開始を固定し、$ を使用して終了を固定します。例: ^(abc)*$、これはグループ (この例では "abc") の 0 回以上の繰り返しに一致し、入力文字列の先頭から始まり、末尾で終わる必要があります。

^(?:[(?[^,][}' ]+?,[S|D],\d{1})])+$+?—とにかく最後まで一致する必要があるため、貪欲でない使用は問題ではありません。ただし、正規表現にはいくつかの問題があります。

^(?:\[[^,]+,[SD],\d\])+$—あなたが望むものにもっと似ているようです。

  • 最初の部分の意味を解読できなかったため、私の正規表現は必要以上に一般的であり、[^,]+,非コンマの後にコンマが続く任意のシーケンスに一致します。実際、おそらく]この否定文字クラスに追加する必要があります。
  • [S|D]3文字の文字クラスですが、|ここでは交互を意味するわけではありません (ただし(S|D)、同じ意味になり[SD]ます)。
  • {1}はどのアトムのデフォルトでもあり、指定する必要はありません。

疑似コード( codepad.orgで実行):

import re
def find_segments(input_string):
  results = []
  regex = re.compile(r"\[([^],]+),([SD]),(\d)\]")
  start = 0
  while True:
    m = regex.match(input_string, start)
    if not m: # no match
      return None # whole string didn't match, do another action as appropriate
    results.append(m.group(1, 2, 3))
    start = m.end(0)
    if start == len(input_string):
      break
  return results

print find_segments("[A-Z,S,3][klm,D,4][0-9,S,1]")
# output:
#[('A-Z', 'S', '3'), ('klm', 'D', '4'), ('0-9', 'S', '1')]

ここでの大きな違いは、式が完全な[...]部分のみに一致することですが、それは連続して適用されるため、最後が終了する場所 (または文字列の最後で終了する場所) から再度開始する必要があります。

于 2010-01-01T09:21:29.827 に答える
0

次のようなものが必要です。

/^(\[[^],]+,[SD],\d\])+$/

C# でこの正規表現を使用する方法の例を次に示します。

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main(string[] args)
    {
        string[] tests = {
            "[A-Z,S,3][A-Za-z0-9,D,4]",
            "[A-Z,S,3]aaaa[A-Za-z0-9,D,4]",
            "crap[A-Z,S,3][A-Za-z0-9,D,4]",
            "[A-Z,S,3][]",
            "[A-Z,S,3][klm,D,4][0-9,S,1]"
        };

        string segmentRegex = @"\[([^],]+,[SD],\d)\]";
        string lineRegex = "^(" + segmentRegex + ")+$";

        foreach (string test in tests)
        {
            bool isMatch = Regex.Match(test, lineRegex).Success;
            if (isMatch)
            {
                Console.WriteLine("Successful match: " + test);
                foreach (Match match in Regex.Matches(test, segmentRegex))
                {
                    Console.WriteLine(match.Groups[1]);
                }
            }
        }
    }
}

出力:

Successful match: [A-Z,S,3][A-Za-z0-9,D,4]
A-Z,S,3
A-Za-z0-9,D,4
Successful match: [A-Z,S,3][klm,D,4][0-9,S,1]
A-Z,S,3
klm,D,4
0-9,S,1
于 2010-01-01T09:19:22.967 に答える