0

テキスト内のすべての単語のテキストを検証するには正規表現が必要です。一意である必要があります。たとえば、私のテキストは次のようになります

有効なテキスト-> 「Advance|Payd | Regular|Next」

無効なテキスト-> 「アドバンス|ペイド|ペイド|レギュラー|ネクスト|アドバンス」

言葉は修正されていませんそれは何でもありえます。

.netでそれを達成する方法を教えてください

4

5 に答える 5

3

単語のリストが明示的に知られていない限り(列挙型のように)、正規表現でそれを達成できるとは思いません。

ただし、.Netでは、他のさまざまな方法で非常に簡単に実行できます。

手始めに、C#とLinqを試してみましょう。

using System;
using System.Linq;

string myText = "aaa|bbb|ccc|aaa";
var parts = myText.Split('|');
var uniques = parts.Distinct();
if(uniques.Count() != parts.Length) throw new ArgumentException("Not unique!");
于 2012-09-01T10:09:48.970 に答える
2

.netについてはよくわかりませんが、ある単語の後に別の一致する単語が続く正規表現は次のようになります。

\b(\w+)\b.*\b\1\b

つまり、単語の区切り、一連の単語の文字、単語の区切り、任意の数の任意の文字(改行を除く)、そして単語が繰り返され、その周りに単語の区切りがあります。

すべての正規表現エンジンで、\1が同じ正規表現内の以前の一致を参照できるわけではありません。

于 2012-09-01T10:11:17.683 に答える
1

これはLinQで簡単です

string curText = "Advance|Paid|Paid|Regular|Next|Advance";
string valid = string.Join("|", curText.Split('|').Distinct());
if(valid.Length != curText.Length)  
    // error.....
于 2012-09-01T10:12:40.167 に答える
0

なぜこれに正規表現を使用するのですか?入力内の文字列Xの出現回数を確認し、最大で1であるかどうかを確認するだけです。この例では、「|」で分割しています。簡単である必要があります(RegExを介して実行できますが、文字列をトークン化する方が簡単なはずです)。

于 2012-09-01T10:09:18.470 に答える
0

ええ、それは後方参照を使用して可能です:

(?:^|\|)([a-z]+)\|.+\|\1(?:\||$)

これは、単語の最初のインスタンスをグループとして、単語が繰り返される表現と一致します。否定して単語が繰り返されているかどうかを確認するか、置換を使用して単語を削除します。

の代わりにスペースを使用するには|

\b([a-z]+)\b.+\b\1\b
于 2012-09-01T10:57:15.073 に答える