タイトルの正規表現を作成するには、C#を使用する必要があります。要件は次のとおりです。
- タイトルが必要です(長さ> 0)。
- 最大256文字(長さ<= 256);
- 文字は禁止されていませんが、空白のみが違法です(空白のみを含むタイトルは違法です)。
- 先頭または末尾の空白はありません。
私はすでにこれを持っています:
^.{1,256}$
では、どうすればルール3を満たすことができますか?
編集:
- ルール3をより明確に説明しました。
- マリオの答えからルール4を追加しました。
使用(?=pattern)
@"^(?=.*\S).{1,256}$"
指定されたパターンがこの(?=pattern)
場所の直後に存在することを表明します。
したがって、正規表現は、文字列の開始後、パターンと一致し、.*\S
文字列全体がパターンと一致する場合にのみ一致します。^.{1,256}$
ゼロ幅アサーションを使用する必要があります。
@"^(?=.*\S).{1,256}$"
(?=.*\S)
空白以外の文字で終わる文字のシーケンスに一致しますが、残りの一致には影響しません。
文字列のクリーンアップと検証を2つの簡単な手順でハードコーディングできるため、正規表現は完全にスキップします。
String.Trim(null)
すべての先頭/末尾の空白を削除するために使用します。空白のみで構成される名前は長さが0にトリミングされるため、これは機能します。また、これにより、などのタイトルの使用が回避され" Let's go!"
ます。
[^ \ s]を使用して、空白以外の任意の文字に一致させることができます
私自身の答えは私の質問に当てはまりますが、私は他の人の答えの後に私の質問を編集したので、クレジットは他の人に行く必要があります(私は賛成して正解として選択しました)。
=====================
私はついに純粋な正規表現ソリューションを思いつきました(余分な手順はありません)
^(\S|\S.{0,254}\S)$
()
(かっこが重要な理由はわかりませんが)
次のテストケースに合格します。
[TestMethod]
public void CheckTitleTest()
{
// Empty
Assert.IsFalse(CheckTitle(@""));
// A whitespace
Assert.IsFalse(CheckTitle(@" "));
// Multiple whitespace only
// http://msdn.microsoft.com/en-us/library/t809ektx.aspx
Assert.IsFalse(CheckTitle(" \t \n \u1680"));
// Leading whitespaces
Assert.IsFalse(CheckTitle(" \tabc"));
// Trailing whitespaces
Assert.IsFalse(CheckTitle("abc\t "));
// Leading and trailing whitespaces
Assert.IsFalse(CheckTitle(" \tabc\t "));
// Too long: 257 character
Assert.IsFalse(CheckTitle(@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/*"));
// A normal title
Assert.IsTrue(CheckTitle(@"This is a normal title"));
Assert.IsTrue(CheckTitle(@"This is a normal title."));
// 256 characters
Assert.IsTrue(CheckTitle(@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"));
// A very simple title
Assert.IsTrue(CheckTitle(@"A"));
Assert.IsTrue(CheckTitle(@"!"));
Assert.IsTrue(CheckTitle(@"\"));
}