1
^(?![_\.\'\-])(?:[\p{L} ]+)$

私が正しく理解していれば、次のとおりです。

  • (?![_\.\'\-])負の先読み。つまり、文字列はアンダースコア、ポイント、アポストロフィ、またはマイナス記号 (任意の数) で始めることはできません。
  • (?:[\p{L} ]+)Ll、Lm、Lo、Lt、Lu およびスペースに少なくとも 1 文字を許可します。

最初の質問は、「1Bob」のようなものは失敗しないはずです (先読みのため)。では、なぜ失敗するのでしょうか。

2 番目の質問は、Ll、Lm、Lo、Lt、Lu の文字のリストまたは説明はどこにありますか?

4

2 に答える 2

3

数字"1"は一致しません\p{L}(これは文字のみに一致します!)。任意の (数値) 数字と一致させたい場合は、クラス\p{N}も使用します。

$text = "1Bob";

if (preg_match("/^(?![_\.\'\-])(?:[\p{N}\p{L} ]+)$/u", $text)) {
  echo "Matched!\n";
} else {
  echo "No match...\n";
}

印刷されます:

Matched!

また、Ruby の正規表現エンジンと PHP の正規表現エンジンには小さな違いがあります。ターゲット言語は PHP のようですので、Rubular (Ruby) ではなく、PHP でテストすることをお勧めします。

文字クラス内では、「通常の」正規表現メタ文字には特別な力がなく、エスケープする必要がないことに注意してください。preg_match("/^(?![_.'-])(?:[\p{N}\p{L} ]+)$/u", $text)

多くの Unicode 文字プロパティ/クラスの概要については、http: //www.regular-expressions.info/unicode.htmlを参照してください。

于 2012-09-22T09:29:51.783 に答える
1
(?![_\.\'\-])

と同じです

(?![_.'-])

括弧で囲まれた文字クラス内のほとんどのメタ文字は、エスケープする必要がありません。ダッシュが理解可能な範囲の一部である場合、ダッシュはエスケープする必要があります。ダッシュは括弧で囲まれた文字クラスの最後にあるため、エスケープする必要もありません。

于 2012-09-23T05:46:39.960 に答える