web-dev-qa-db-ja.com

単語間にスペースを入れるための正規表現

記号を避け、文字と数字だけを許可する正規表現が必要です。この正規表現はうまく機能しますが、単語の間にスペースを入れることはできません。

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

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

スペースを許可するように調整するにはどうすればよいですか。

143
lawphotog

tl; dr

文字クラス にスペースを入れるだけです。

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


さて、あなたが厳密になりたいのなら...

上記は正しくありません。 *ゼロ以上を意味するため、通常は一致するとは限らない、以下のすべての場合に一致します。

  • 空の文字列 "".
  • 完全にスペースで構成される文字列 ""。
  • "Hello World"のように、スペースで前後に続く文字列。
  • 単語間に複数のスペースが含まれているストリング「Hello World」。

もともと私は、厳密さは問題ではないと思われるという基本的な質問をOPが求めていたので、そのような詳細が入る価値があるとは思いませんでした。質問が人気を博した今、私は言いたいです...

... @ stema's answer を使用してください。

これは、私の好みでは(\wを使用せずに)次のように解釈されます。

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

(@stemaを問わずに投票してください。)

この(そして@ stemaの)答えについて注意すべきことがいくつかあります。

  • 単語間にmultipleスペースを許可したい場合(たとえば、偶然のダブルスペースを許可したい場合、または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]で書き出してください。


* 私はこの質問が vb.net とタグ付けされていることを知っていますが、25,000以上のビューに基づいて、私はそれがこの質問に遭遇している人々だけではないと思います。現時点では、検索フレーズ正規表現スペースWordが最初にGoogleにヒットしました。

271
Andrew Cheong

1つの可能性は、acheong87が提案するように、単にあなたの文字クラスにスペースを追加することでしょう。これはあなたのパターンの厳格さによります。

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

私は\wを使います。これはほとんどの正規表現で[a-zA-Z0-9_]と同じです(あるものではUnicodeベースです)。

^\w+( \w+)*$

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

^文字列の先頭に一致

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

( \w+)*は、0回以上繰り返されるグループです。グループでは、スペースとそれに続く一連の少なくとも1つのWord文字が必要です。

$は文字列の末尾と一致します

97
stema

これは私のために働いた

([\w ]+)
21

試してみてください。

^(\w+ ?)*$

説明:

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

先頭や末尾のスペースは不要だと思います。これは、正規表現を "最初の文字"、 "途中のもの"、 "最後の文字"に分割する必要があることを意味します。

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

あるいは、Perlのような構文を使っているなら:

^\w[\w ]*\w$

また、空の文字列も許可することを意図的に正規表現に付け加えた場合は、すべてをオプションにする必要があります。

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

単一のスペース文字だけを許可したい場合は、少し違って見えます。

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

これは、0..n語とそれに続く単一の空白、および空白なしの1つの単語と一致します。そして空の文字列を許可するために全体をオプションにします。

4
creinig

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

\w+.*$
3
jaxxbo

アルファベットのみの場合:

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

英数字および_の場合

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

この正規表現

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

単語と単語の間にはスペースを1つだけ入れて、前後にスペースを入れないでください。

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

  1. ^文字列の先頭に位置をアサート
  2. \w+任意のWord文字と一致します。[a-zA-Z0-9_]
    1. 数量詞:+ 1回と無制限の間、可能な限り多くの回数、必要に応じて返す[greedy]
  3. 第1捕獲グループ(\s\w+)*
    1. 数量詞:* 0回から無制限の間、可能な限り多くの回数、必要に応じて返す[greedy]
    2. \s任意の空白文字と一致します[\r\n\t\f ]
    3. \w+任意のWord文字と一致します。[a-zA-Z0-9_]
      1. 数量詞:+ 1回と無制限の間、可能な限り多くの回数、必要に応じて返す[greedy]
  4. $文字列の末尾に位置をアサート
2

私はこれが "FullName"に適していると思います。

([a-z',.-]+( [a-z',.-]+)*){1,70}/
0
Adam K Dean

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

...そして、bupkisはStack Overflowや他のサイトと同様に、開始文字列や末尾の空白文字のない任意の文字列と、厳密に英字の単語の間の単一の空白文字にマッチする正規表現を探します。

^[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]+$を指定したスイッチ/ if-elseを使用するだけです。)

お楽しみください:D

0
LokizFenrir

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

[a-zA-Z0-9_ ]
0
KayV

ユーザーがキーボード文字を含む場合、上記のコードはすべて機能しません。ユーザーが任意の文字や単語を追加することを許可されているが、単語の間にスペースを入れることができる場合です。

 ^[^ ]+( [^ ]+)*$
0

スペースがオプションの場合は、次のものを一致させることができます。

string1 = 'hello_World'

または

string2 = 'hello world'

によって

pattern = '[\w\s]+'
0
tanzil

これを試してください:( Python版)

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

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

0
MoMo