0

「fooBAR」などの文字列が与えられた場合、文字列の末尾の大文字 (つまり「BAR」) を次のひねりを加えて一致させたいと考えています。

  1. 一致には少なくとも 2 文字が含まれている必要があります
  2. 一致に次のいずれも含めてはなりませ: 1D、2D、3D、4D

例:

"fooB" -> ""
"fooBAR" -> "BAR"
"foo64BAR" -> "BAR"
"foo64BR" -> "BR"
"fooDBAR" -> "DBAR"
"foo12BAR" -> "BAR"
"foo1DBAR" -> "BAR"

些細な正規表現

[A-Z][A-Z]+

最後の例は失敗します ("BAR" ではなく "DBAR" を返します)。

などの否定的な後読み

(?<![1-4D])[A-Z][A-Z]+

最後の例も失敗します ("BAR" ではなく "AR" を返します)。

これは簡単なはずですが、私の愛のために解決策を見つけることができません。何か案は?

4

5 に答える 5

2

次の行に沿って、いくつかの単純なパターンを少しのコードと組み合わせて使用​​します。

string GetMatch(string input)
{
    var match = Regex.Match(input, @"\d?([A-Z]{2,})$");
    if (Regex.Match(match.Value, @"^[1-4]D").Success)
        return match.Groups[1].Value.Substring(1);
    else
        return match.Groups[1].Value;
}
于 2013-10-25T19:53:57.593 に答える
0

FJの正規表現パターン

(?!(?<=[1-4])D)[A-Z]{2,}$

次のようなすべての可能な入力に対して正しくない

fooBar1DDBAR
fooBar1DDB

少し修正すると、トリックが作成されます。

(?<![A-Z])(?!(?<=[1-4])D)[A-Z]{2,}$

http://rubular.com/r/dGJWj7lE79 (FJ) とhttp://rubular.com/r/mOux7d4zv3の違いを参照してください。

于 2013-10-27T22:46:58.950 に答える
0

以下が機能するはずです。

(?!(?<=[1-4])D)[A-Z]{2,}$

ここでの主要な正規表現は[A-Z]{2,}で、文字列の末尾にある 2 つ以上の大文字に一致します。否定先読み(?!(?<=[1-4])D)は、他の要件をカバーします。これは、「前の文字が 1 から 4 までの数字で、次の文字が D の場合は失敗」と読むことができます。

文字列の末尾ではなく、行の末尾で一致させたい場合は、 を使用しますRegexOptions.Multiline

例: http://rubular.com/r/XgKv9pavJd

于 2013-10-25T19:53:50.717 に答える