単語間のスペースを許可する正規表現


188

記号を防ぎ、文字と数字のみを許可する正規表現が必要です。以下の正規表現はうまく機能しますが、単語間のスペースは許可されません。

^[a-zA-Z0-9_]*$

たとえば、この正規表現を使用する場合、「HelloWorld」は問題ありませんが、「Hello World」は一致しません。

どうすればスペースを許可するように微調整できますか?

回答:


367

tl; dr

キャラクタークラスにスペースを追加するだけです。

^[a-zA-Z0-9_ ]*$

 


今、あなたが厳格になりたいなら...

上記は正確ではありません。起因するという事実に*手段がよりゼロか、それは1つが、通常は一致するわけではないであろうと、次の例すべてに一致します。

  • 空の文字列 ""。
  • スペースのみで構成される文字列 ""。
  • スペースで先行および/または後続する文字列「Hello World」。
  • 「Hello World」という単語の間に複数のスペースを含む文字列。

もともと私は、OPが厳密さを気にする必要がないような基本的な質問をしているので、そのような詳細を検討する価値があるとは思いませんでした。質問がいくつかの人気を得た今、私は言いたい...

... @ stemaの回答を使用します

これは、私の味では(を使用しない場合\w)、次のように変換されます。

^[a-zA-Z0-9_]+( [a-zA-Z0-9_]+)*$

(@stemaに関係なく投票してください。)

この(および@stemaの)回答について注意すべき点:

  • 単語間に複数のスペースを許可したい場合(たとえば、誤って2つのスペースを許可したい場合、またはPDFからコピーして貼り付けたテキストで作業している場合)、+スペースの後にを追加します。

    ^\w+( +\w+)*$
  • タブと改行(空白文字)を許可する場合は、スペースを\s+:に置き換えます。

    ^\w+(\s+\w+)*$

    ここでは、+デフォルトでをお勧めします。たとえば、Windowsの改行は2つの空白文字で構成されている\r\nので、+両方をキャッチする必要があります。

まだ動作していません?

使用している正規表現の方言を確認してください。* Javaのような言語では、あなたのバックスラッシュをエスケープする必要があります、つまり、 \\w\\s。古い以上の基本的な言語やユーティリティ、のようにsed\w\s定義されていないので、文字クラス、でそれらを書くなど [a-zA-Z0-9_]して[\f\n\p\r\t]、それぞれ。

 


*この質問にタグが付いていることを知っています、しかし25,000以上のビューに基づいて、この質問に出くわしているのはそれらの人々だけではないと思います。現在、これは検索フレーズである正規表現スペースワードのグーグルでの最初のヒットです。


3
空の文字列を許可
Neha Choudhary 2013

1
うわー、とてもシンプル!ありがとう。正規表現を生成するために使用できるサイトまたは何かがあるのではないですか、つまり、noobsのために...
Pierre

1
@Pierre-人間の指示を受け取って明示的なルールに変換することはかなり困難です。(人間の言語は流動的で曖昧なものでいっぱいであり、私たちの脳は物事を解決してギャップを埋めるのに必要なほとんどの作業を行います。コンピューターにはそのような脳はありません。 )正規表現を視覚的に表すdebuggex.comのようなツールは存在しますが、魅力的であるので、完全な初心者にはあまり役立ちません。ただし、基本を理解するにはインタラクティブなチュートリアルをお勧めします。
Andrew Cheong

1
はい、スペースがある場合、正規表現も一致します。ネハ・チョーダリーのコメントへの返事。
Rajshekar Reddy

1
@Pierre 3年後-今日この質問に出くわしましたが、あなたのコメントを見ました。正規表現のテストには、正規表現のヒーロー(regexhero.net)を使用しています。オンライン版は、Silverlightを備えたInternet Explorerでのみ機能すると思いますが、何もないよりはましです。
Michael Armes

120

1つの可能性は、acheong87が示唆するように、文字クラスにスペースを追加することです。これは、5つのスペースで始まる文字列、またはスペースのみで構成される文字列も許可するため、パターンの厳密さによって異なります。

他の可能性はパターンを定義することです:

私は\wこれをほとんどの正規表現のフレーバーで使用します[a-zA-Z0-9_](一部ではUnicodeベースです)

^\w+( \w+)*$

これにより、一連の少なくとも1つの単語が許可され、単語はスペースで区切られます。

^ 文字列の先頭に一致

\w+ 一連の少なくとも1つの単語文字に一致

( \w+)*0回以上繰り返されるグループです。グループでは、スペースの後に一連の少なくとも1つの単語文字が続くことを期待しています

$ 文字列の終わりに一致


これ:regex101.com/#javascriptは、分析する正規表現パターンについても説明しています。
Dark Star1 2014

ニースの正規表現、[0-9a-z]などよりもはるかに単純
ジョージ


11

試してみてください:

^(\w+ ?)*$

説明:

\w             - alias for [a-zA-Z_0-9]
"whitespace"?  - allow whitespace after word, set is as optional

2
これは、バックトラッキング地獄を誘発することになります。
nhahtdh 2013年

1
たとえば、一致しない文字列が指定された場合、ggggggggggggggggggggggggggggggggggggg;過度のバックトラックが原因で、正規表現が結果に到達するまでに非常に長い時間がかかります。
nhahtdh 2013年

さて、あなたは何を提案しますか?
hsz 2013年

7

前後のスペースは不要だと思います。つまり、正規表現を「最初の文字」、「途中の文字」、「最後の文字」に分割する必要があります。

^[a-zA-Z0-9_][a-zA-Z0-9_ ]*[a-zA-Z0-9_]$

または、perlのような構文を使用する場合:

^\w[\w ]*\w$

また、空の文字列も許可するように意図的に正規表現を使用した場合は、全体をオプションにする必要があります。

^(\w[\w ]*\w)?$

単一のスペース文字のみを許可する場合は、少し異なります。

^((\w+ )*\w+)?$

これは、0..nの単語の後に単一のスペースが続き、さらにスペースのない1つの単語に一致します。また、空の文字列を許可するために、全体をオプションにします。


スペースと\s同等ではありません。\sスペースだけではありません。
nhahtdh 2013年

@nhahtdh:コメントをありがとう。私は、一般的に、空白のマッチングに慣れていると思います。答えは修正されました。
creinig 2013年

最初の式で閉じ括弧が欠落している可能性はありますか?やってみなかったのかわかりません。
ssinfod

@ssinfod:良いキャッチ。実際、左括弧はその例では不必要です。ありがとう。
クレイニー

3

この正規表現

^\w+(\s\w+)*$

単語間にスペースを1つだけ入れ、先頭または末尾のスペースは入れません。

以下は正規表現の説明です。

  1. ^ 文字列の開始位置をアサートします
  2. \w+ 任意の単語文字に一致 [a-zA-Z0-9_]
    1. 量指定子:+1回から無制限の回数まで、可能な限り多くの回数、必要に応じて差し戻します[貪欲]
  3. 第1捕獲グループ (\s\w+)*
    1. 量指定子:*ゼロから無制限の回数まで、可能な限り多くの回数、必要に応じて返却します[貪欲]
    2. \s 空白文字に一致 [\r\n\t\f ]
    3. \w+ 任意の単語文字に一致 [a-zA-Z0-9_]
      1. 量指定子:+1回から無制限の回数まで、可能な限り多くの回数、必要に応じて差し戻します[貪欲]
  4. $ 文字列の最後に位置をアサートする

2

これは最初にスペースを許可しません。ただし、単語間にスペースを許可します。単語間の特殊文字も使用できます。FirstNameおよびLastNameフィールドに適した正規表現。

\w+.*$

この答えは不正確/不正確です。このパターンは、1つ以上の英数字、アンダースコア、次にゼロ以上の非改行文字に一致します。OPには問題ありません。
mickmackusa

2

アルファベットのみ:

^([a-zA-Z])+(\s)+[a-zA-Z]+$

英数字値と_

^(\w)+(\s)+\w+$

1
(something)+は(something +)と同じではないため、これは良い例ではありません。最初の例では、1文字だけが$ 1としてキャプチャされます。
Znik

0

これを試してください:(Pythonバージョン)

"(A-Za-z0-9 ){2, 25}"

データセットに基づいて上限を変更する


0

次のように、正規表現パターンの最後にスペースを追加するだけです。

[a-zA-Z0-9_ ]

-1

これらの想定される答えの多くをよく見ていた...

...また、スタックオーバーフローやその他のサイトを調べて、開始または末尾の空白がなく、完全にアルファ文字の単語の間に1つのスペースしかない文字列に一致する正規表現を探した後のbupkis 。

^[a-zA-Z]+[(?<=\d\s]([a-zA-Z]+\s)*[a-zA-Z]+$

したがって、英数字に簡単に変更できます。

^[a-zA-Z0-9]+[(?<=\d\s]([a-zA-Z0-9]+\s)*[a-zA-Z0-9]+$

(これは単一の単語とは一致しませんが^[a-zA-Z0-9]+$、さらに単一の単語をキャッチする必要がある場合は、switch / if-elseを単純に使用するだけです。)

楽しむ:D


3
[(?<=\d\s]マッチする1つの文字:(?<=、数字、または空白文字、そしてそれはあなたが何を意味することはできません。後読みであると想定されていた場合、それはであるべきですが(?<=\d\s)、そこでは意味がありません。正規表現は決して一致しません。
Alan Moore

賛成者へ:間違ったソリューションに反対票を入れないでください。彼らは他のユーザーを混乱させ、正規表現ができないことをできると信じ込ませます。
WiktorStribiżew19年


-4

。*?それが私のために働いた空白を許可する


それは.すべてに一致するためです。これは、ここでの解決策ではない可能性が非常に高いです。
ルービック2014

これは、このシーケンスの前後の内容に応じて、ゼロまたは任意の文字に一致します。これはできるだけ一致しません。単一のドットは任意の単一の文字を表します。
Znik、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.