0

文字列OKAY、ハイフン、ゼロまたは1単語の文字を含む式に一致する正規表現が必要です。この後、単語以外の文字が受け入れられ、その後は何でも受け入れられます。一致する式の場合、OKAY は、単語文字が続く場合は OK に変更され、たとえば、次の文字が A の場合は OA に変更されます。ハイフンが存在する場合は削除されます。

OKAY         =>       OK
OKAY-        =>       OK
OKAYA        =>       OA
OKAY-A       =>       OA
OKAYAB       =>       OKAYAB          (no-match)
OKAY-AB      =>       OKAY-AB         (no-match)

例の後には次のようなものがあります: 結果を変更せずに .CD

OKAY.CD         =>       OK.CD
OKAY-.CD        =>       OK.CD
OKAYA.CD        =>       OA.CD
OKAY-A.CD       =>       OA.CD
OKAYAB.CD       =>       OKAYAB.CD          (no-match)
OKAY-AB.CD      =>       OKAY-AB.CD         (no-match)

これを実装する私の問題は、ハイフンと単語文字の両方がオプションであるため、不要なケースにも一致する「遅延」一致が得られることでした。教育のために、先読みのある場合とない場合の両方の例をいただければ幸いです(可能であれば)。

4

3 に答える 3

2

これがあなたのために働くはずの正規表現です:

\bOKAY(?>-?)(\w)?([^\w\s]\S*)?(?!\S)

使用している言語が明確でないため、置換を行う方法の擬似コードを次に示します。

"O" + (match.group(1) if match.group(1) else "K") + match.group(2)

ここにrubularがあります:http ://www.rubular.com/r/SE8MBkUUUo


編集:コメントの後に上記の正規表現にいくつかの変更を加えましたが、以下の説明はそれらの変更を反映していません。元の正規表現からの変更点は次のとおりです。

  • 行頭から開始する必要がないように変更^しました\b
  • \Wになった、これは1つの一致になる[^\w\s]ことを防ぎますOKAY OKAY
  • 試合が空白で終了するように変更.*されました\S*
  • に変更$されました。これは、「文字列の最後にあるか、次の文字が空白である場合にのみ一致する」こと(?!\S)を意味し、次のように書くこともできます。(?!\S)(?=\s|\z)

ここで本当に注意が必要なのは、のような正規表現が機能するよう^OKAY-?(\w)?(\W.*)?$に見えることですが、最終的にはとのOKAY-AB両方が一致せず、文字列の残りの部分と一致するため、このような場合には機能しません。-?(\w)?(\W.*)?

これを修正するために必要なことは、-?後戻りしないようにすることです。所有格の数量詞が.NETでサポートされていれば、これは簡単です。それをに変更するだけ-?+です。

残念ながら、これらはサポートされていないため、代わりにアトミックグループ化を使用する必要があります。 (?>-?)オプションでに一致-しますが、グループを終了するとすぐにすべてのバックトラック情報を忘れます。アトミックグループはキャプチャしないので、(\w)?キャプチャグループ1もキャプチャすることに注意してください。

于 2012-05-23T18:40:00.450 に答える
1

先読みなしでこれを行うには、次を使用できます

^(OKAY)(((-\w?|\w)(\W.*)?)|[^-\w].*)?$

これは、単語「OKAY」に一致し、次に、オプションの単語文字、オプションの非単語文字の後に任意のグループが続くオプションのグループ、または単語文字の後に何かが続く文字ではない文字に一致します。とはそれぞれ文字列の開始と終了に一致するため、受け入れ可能な文字列にのみ正確に一致します。--^$

先読みはほとんど違いを生まないでしょう。唯一の変更は(?=...)、「OKAY」グループの後のすべての周りに先読み()を配置することです。

これを.netで使用するために必要な唯一の変更は\、文字列内のすべてをエスケープすることです。

于 2012-05-23T18:18:35.973 に答える
1

.NET正規表現はわかりませんが、これはpregスタイルのマッチングから始まります:

OKAY-?(\w?)([^\w-]\w+)?\s*$

$1 が空の場合、出力は OK$2 です

それ以外の場合、出力は O$1$2 です。

于 2012-05-23T18:49:32.377 に答える