2

文字列が特定の形式であることを確認する必要があります...ここにルールがあります。

  • コロンおよび/またはドットを含めることができます。
  • コロンとドットはどちらもオプションです
  • コロンおよび/またはドットを指定する場合は、コロン/ドットの左側に少なくとも1文字、右側に1文字が必要です。
  • 両方を指定する場合、コロンはドットの前にある必要があります
  • 0または1つのコロンと0または1つのドットのみが許可されます
  • AnyStringコロンとドットを除く1つ以上のUnicode文字の文字列を意味します(コロンとドットの文字はの一部として使用できませんAnyString)。

例:

することができます...

AnyString:AnyString.AnyString
AnyString:AnyString
AnyString.AnyString
AnyString

できません...

AnyString:.AnyString
AnyString.AnyString:AnyString
AnyString:
AnyString.
:AnyString
.AnyString

私はさまざまな組み合わせを試しましたが、正規表現が得意ではないため、これを取得することはできません。

前もって感謝します

4

6 に答える 6

4

それは次のようになります。

  • 1 つ以上のコロンまたはドット以外の文字で始まることは間違いありません
  • 次に、オプションで、コロンの後に 1 つ以上のコロンまたはドット以外の文字が続きます。
  • 次に、オプションで、ドットの後に 1 つ以上のコロンまたはドット以外の文字が続きます。
  • 「コロンと X」セクションと「ドットと X」セクションの両方がある場合は、コロン セクションが最初に来る必要があります。

(私が上記を書いたとき、あなたの今編集された説明は存在しなかったことに注意してください。したがって、それは単に例に基づいていました。)

したがって、次のような正規表現になると思います。

^[^.:]+(?::[^.:]+)?(?:\.[^.:]+)?$

ノート:

  • バックスラッシュをエスケープする必要がないように、これらすべてを逐語的な文字列リテラルに入れたいと思うでしょう。

    var regex = new Regex(@"^[^.:]+(?::[^.:]+)?(?:\.[^.:]+)?$");
    
  • ^文字列の先頭に一致

  • [^.:]ドットまたはコロン以外の任意の文字に一致します
  • +「少なくとも1つ」の構文です
  • (?:<subexpression>)非キャプチャ グループの構文です。
  • \..「任意の文字」を意味するエスケープされたドットです。
  • ?「ゼロまたは1」の構文です(つまり、オプション)
  • $文字列の末尾に一致

テストコード:

using System;
using System.Text.RegularExpressions;

class Test
{
    static readonly Regex regex =
        new Regex(@"^[^.:]+(?::[^.:]+)?(?:\.[^.:]+)?$");

    static void Main()
    {
        AssertValid("AnyString:AnyString.AnyString",
                    "AnyString:AnyString",
                    "AnyString.AnyString",
                    "AnyString");

        AssertInvalid("AnyString:.AnyString",
                      "AnyString.AnyString:AnyString",
                      "AnyString:",
                      "AnyString:..Anystring",
                      "AnyString.",
                      ":AnyString",
                      ".AnyString");
    }

    static void AssertValid(params string[] inputs)
    {
        foreach (var input in inputs)
        {
            if (!regex.IsMatch(input))
            {
                Console.WriteLine("Expected to match but didn't: {0}",
                                  input);
            }
        }
    }

    static void AssertInvalid(params string[] inputs)
    {
        foreach (var input in inputs)
        {
            if (regex.IsMatch(input))
            {
                Console.WriteLine("Expected not to match but did: {0}",
                                  input);
            }
        }
    }
}
于 2012-11-01T21:29:42.997 に答える
0

これが基本的なバージョンです: (?:[^:.]+:)?(?:[^:.]+\.)?[^:.]+. Anystringより厳密に定義すると、これは改善される可能性があります。

基本的な要件には、3 つの部分があるようです。ゼロまたは 1 つの「Anystring」の後にコロンが続き、次にゼロまたは 1 つの「Anystring」の後にドットが続き、その後に必須の「Anystring」が続きます。これは、正規表現の構造に反映されています。

私が持っている情報を考えると[^:.]+Anystring唯一の制約は

  • 長さをゼロにすることはできません
  • コロンまたはドットを含めることはできません (これは、最大 1 つのコロンと 1 つのピリオドが許可されているという事実によって暗示されます)
于 2012-11-01T21:30:16.917 に答える
0
/^[a-z]+[:.]?[a-z]+[:.]?[a-z]+$/i

どのようにそのことについて?それには数字が含まれていません。「AnyString」には何を含めることができますか?

于 2012-11-01T21:31:15.253 に答える
0

これ、リストされた基準をすべて満たしているようです。

^[^.:]+(:[^.:]+)?(\.[^.:]+)?$

AnyString文字通り、コロンやピリオドを含まないものなら何でもよいと思います。また、開始/終了行アンカーを追加したことにも注意してください。必要に応じて、それらを削除できます。

この正規表現は、人間の言葉で次のように変換されます。

  • コロンでもピリオドでもない 1 つ以上の文字。
    • オプションで、コロンと、コロンでもピリオドでもない 1 つ以上の文字が続きます。
    • 必要に応じて、ピリオドと、コロンまたはピリオド以外の 1 つ以上の文字が続きます。
于 2012-11-01T21:39:07.353 に答える
0

論理的な部分に正しく分解すれば、一致ルールは非常に単純です。

あなたの文字列が含むことができる最大の構造を取ります

あれは

    TEXT:TEXT.TEXT

次のようにその構造を壊します。

    **TEXT**  then  **:CHARACTER**   then   **TEXT**  then **.CHARACTER**     then    **TEXT**

この内訳は、

    1. your text starts with a letter, then 0 or more series of letters follow
    2. after it can either contain or not contain a colon which is immediately followed by a letter
    3. then again 0 or more series of letter; pay attention here **0 or more**
    4. then it can contain or not contain a dot immediately followed by a letter
    5. then again 0 or more series of letters; pay attention here **0 or more**

古典的な正規表現定義言語では、正規表現は次のようになります

    [A..Za..z]+  (:[A..Za..z]){0,1}   [A..Za..z]*   (\.[A..Za..z]){0,1}   [A..Za..z]*

読みやすくするために、上記のポイント 1 から 5 を定義する部分を分けました。実際の使用では、正規表現に空白があってはなりません。

これがお役に立てば幸いです。

乾杯。

于 2012-11-01T22:35:51.833 に答える
0

これを試して

(.+):(.+)\.(.+)|(.+)\.(.+)
于 2012-11-01T21:54:38.650 に答える