1

のようなデータを探していますabc/def。テキストの前後に空白がある可能性があるため、次のすべてが有効になります:abc__/_defまたは__abc/__def__。(アンダースコアを使用してスペースを視覚化します。)

私はこの正規表現を思いついた:

(?<=\s*)abc\s*\/\s*def(?=\s*|^)

これは一致を見つけるために機能します。私は最近先読みを取得し、この式を試して/、一致から周囲のスペースを除外しました(したがって、abc__/_def一致が生成されますabc/def)。

(?<=\s*)abc(?=\s*)\/(?=\s*)def(?=\s*|^)

この表現は機能しません-私は明らかに先読みについて何かを誤解しています。誰かが2つの表現の違いを説明できますか?(私がやろうとしていることさえ可能ですか?正規表現のドキュメントを読んだ後、私はそれが正しいと思いましたが、おそらく私は間違っています。)

4

3 に答える 3

1

.NET正規表現によって返される一致は、元の文字列の連続したサブ文字列です。これは、「/」文字の周りのスペースを取り除くことができないことを意味します。しかし、あなたは宇宙空間を取り除くことができます。

良いアプローチは、名前付きグループを照合abcして使用し、次を使用してその情報を抽出することです。def

Match m = ...;
var part1 = m.Groups["part1"].Value;
var part2 = m.Groups["part2"].Value;

これを試して:^\s*(?<part1>\w+)\s*/\s*(?<part2>\w+)\s*$

多くの場合、正規表現は、名前付きグループを使用し、ルックアラウンドを使用しない方が自然です。

于 2012-10-09T17:55:00.677 に答える
1

何かを見つけて結果から除外しようとするときは、先読みなどが使用されます。

たとえば、スラッシュとabcの間に空白がある場合、先読みはそれらを検出しますが、それらを除外したため、結果として空白を選択することはできません。式に一致する連続した文字列がないため、文字列は選択されません。

あなたは選択から空白を除外したかったのですが、私が知る限り、それはできません。

必要に応じて、abcを選択することもできます。

(?<=\s*)abc(?=(\s*\/\s*def(\s*|^)))

ただし、選択範囲をさまざまな領域に広げることはできません。

後で選択をフィルタリングする必要がある場合は、stringbuilderを使用して推奨し、そのように結果を繰り返し処理します(速度上の理由から)。

    public Boolean TryRegexMatchRemovedWhiteSpace(string input, string expr, out String matched)
    {

        Match m = Regex.Match(input, expr);
        if (m.Success)
        {
            StringBuilder r = new StringBuilder(m.Value.Length);
            foreach (var c in m.Value)
            {
                if (!char.IsWhiteSpace(c))
                {
                    r.Append(c);
                }
            }
            matched = r.ToString();
        }
        else
        {
            matched = "";
        }
        return m.Success;
    }
于 2012-10-09T18:12:28.593 に答える
0

先を見越しているためですが、一致させようとする場合は含まれません。だから、あなたが使用する場合

abc(?= \ s *)

abc またはabc___と一致し ます

ただし、どちらの場合も、一致グループ[0]は「abc」です。

したがって、2番目の正規表現はabc / defのみに一致し、abc __ /_defには一致しません。

読者

于 2012-10-09T17:59:40.880 に答える