단어 사이에 공백을 허용하는 정규식


191

기호를 방지하고 문자와 숫자 만 허용하는 정규식을 원합니다. 아래 정규식은 훌륭하지만 단어 사이에 공백을 허용하지 않습니다.

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

예를 들어이 정규식을 사용하는 경우 "HelloWorld"는 문제가 없지만 "Hello World"는 일치하지 않습니다.

공백을 허용하도록 어떻게 조정할 수 있습니까?

답변:


372

tl; dr

캐릭터 클래스에 공백을 추가하십시오 .

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

 


지금, 당신이 엄격한되고 싶다면 ...

위의 내용이 정확하지 않습니다. 0 이상*의미 한다는 사실로 인해 다음과 같은 경우 모두 일치한다는 의미는 아닙니다.

  • 빈 문자열 "".
  • 문자열은 공백 ""으로 구성됩니다.
  • 공백이있는 "Hello World"로 이어지는 문자열입니다.
  • 단어 "Hello World"사이에 공백이 여러 개 포함 된 문자열입니다.

원래 OP는 엄격 성이 중요하지 않은 것처럼 보이는 기본적인 질문을했기 때문에 그러한 세부 사항이 가치가 있다고 생각하지 않았습니다. 그러나 질문이 어느 정도 인기를 얻었으므로 말하고 싶습니다 ...

... @ stema의 답변을 사용하십시오 .

내 맛에서 (을 사용하지 않고 \w) 다음과 같이 해석됩니다.

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

(@stema와 상관없이 upvote하십시오.)

이 (및 @stema의) 답변에 대해 알아야 할 사항 :

  • 단어 사이에 여러 공백 을 허용 하려면 (예를 들어 실수로 두 번 공백을 허용하거나 PDF에서 복사하여 붙여 넣은 텍스트로 작업하는 경우) 공백 +뒤에 다음을 추가하십시오 .

    ^\w+( +\w+)*$
  • 탭과 줄 바꾸기 (공백 문자)를 허용하려면 공백을 다음으로 바꾸십시오 \s+.

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

    여기가 제안 +예를 들어, 윈도우 바꿈이 구성 때문에 기본적으로 시퀀스의 공백 문자, \r\n당신이 필요합니다, 그래서는 +모두를 잡을 수 있습니다.

그래도 작동이 안되는?

사용중인 정규식의 방언을 확인하십시오. * Java와 같은 언어에서는 백 슬래시 ( \\w , 및) 를 이스케이프해야합니다 \\s. 세 이상의 기본 언어와 유틸리티,에서와 같은 sed, \w그리고 \s정의되지 않은, 그래서 문자 클래스, 그들을 쓰는 [a-zA-Z0-9_][\f\n\p\r\t]각각.

 


* 이 질문에 태그가 있다는 것을 알고 있습니다, 그러나 25,000 + 조회수를 기반으로, 나는이 질문을 겪는 사람들뿐만 아니라 추측합니다. 현재 Google에서 검색 구문, 정규 표현식 공백 단어를 처음으로 맞았습니다 .


3
빈 문자열을 허용합니다
Neha Choudhary

1
와우, 너무 간단합니다! 감사. 내가 의미하는 멍청한 놈을 위해 정규 표현식을 생성하는 데 사용할 수있는 사이트 또는 무언가가 없습니까?
Pierre

1
@Pierre-사람의 지시를 받아 명시적인 규칙으로 변환하는 것은 상당히 어렵습니다. (인간의 언어는 유동적이고 모호함으로 가득 차 있으며, 우리의 두뇌는 사물을 해결하고 격차를 메우는 데 필요한 대부분의 작업을 수행합니다. 컴퓨터에는 그러한 두뇌가 없으며, 그것을 흉내 내려는 영리한 시도는 아직 충분히 강력하지 않습니다. ) 정규식을 시각적으로 나타내는 debuggex.com 과 같은 도구가 있지만 초보자에게는 도움이되지 않을 수 있습니다. 그러나 기본 사항을 이해하려면 대화식 자습서 를 권장합니다 .
Andrew Cheong

1
예, 공백이 있으면 정규식도 일치합니다. 내 답변은 Neha choudary의 의견에 대한 것이었다.
Rajshekar Reddy

1
@Pierre 3 년 후-오늘이 질문을 접했습니다. 정규식 을 테스트 하기 위해 regex hero ( regexhero.net )를 사용 합니다. 온라인 버전은 Silverlight가 설치된 Internet Explorer에서만 작동하지만 아무것도 아닌 것이 좋습니다.
Michael Armes

121

한 가지 가능성은 acheong87이 제안한 것처럼 캐릭터 클래스에 공백을 추가하는 것입니다.이 패턴은 패턴이 얼마나 엄격한 지에 달려 있습니다. 이는 5 개의 공백으로 시작하는 문자열 또는 공백으로 만 구성된 문자열을 허용하기 때문입니다.

다른 가능성은 패턴을 정의하는 것입니다.

나는 \w이것을 대부분의 정규식 풍미에서 사용 합니다 [a-zA-Z0-9_](일부에서는 유니 코드 기반입니다)

^\w+( \w+)*$

이렇게하면 일련의 단어가 하나 이상 허용되며 단어는 공백으로 나뉩니다.

^ 문자열의 시작과 일치

\w+ 일련의 최소 하나의 단어 문자와 일치

( \w+)*0 번 이상 반복되는 그룹입니다. 그룹에서는 공백이 있고 일련의 단어 문자가 하나 이상 있어야합니다.

$ 문자열의 끝과 일치


이 : regex101.com/#javascript는 또한 좋은으로 분석 할 정규식 패턴에 대한 설명을 제공합니다.
다크 스타 1

좋은 정규 표현식, 훨씬 간단하고 많은 [0-9a-z] 등
George


12

시도해보십시오 :

^(\w+ ?)*$

설명:

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

2
이것은 역 추적 지옥을 유도 할 것입니다.
nhahtdh

1
예를 들어, 일치하지 않는 문자열이 주어지면 ggggggggggggggggggggggggggggggggggggg;정규 표현식이 과도한 역 추적으로 인해 결과에 도달하는 데 시간이 오래 걸립니다.
nhahtdh

좋아, 그래서 당신은 무엇을 제안합니까?
hsz

7

나는 당신이 앞 / 뒤 공간을 원하지 않는다고 가정합니다. 즉, 정규식을 "첫 번째 문자", "중간에있는 물건"및 "마지막 문자"로 분할해야합니다.

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

또는 perl과 같은 구문을 사용하는 경우 :

^\w[\w ]*\w$

또한 : 의도적으로 정규 표현식에 빈 문자열도 허용한다고 말하면 전체 항목을 선택 사항으로 만들어야합니다.

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

단일 공백 ​​문자 만 허용하려면 약간 다르게 보입니다.

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

이것은 0..n 단어 뒤에 하나의 공백과 공백이없는 단어를 더한 것과 일치합니다. 그리고 빈 문자열을 허용하기 위해 모든 것을 선택적으로 만듭니다.


공간과 \s동일하지 않습니다. \s단순한 공간 이상을 찾습니다.
nhahtdh

@nhahtdh : 댓글 주셔서 감사합니다. 나는 일반적으로 공백을 일치시키는 데 너무 익숙합니다 .. 대답은 고정되어 있습니다.
creinig

첫 번째 표현식에서 닫는 괄호가 누락되었을 수 있습니까? 시도하지 않았는지 잘 모르겠습니다.
ssinfod

@ ssinfod : 잘 잡아. 실제로이 예에서는 여는 괄호가 불필요합니다. 감사.
creinig

4

이 정규식

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

단어 사이에 하나의 공백 만 허용하고 선행 또는 후행 공백은 허용하지 않습니다.

다음은 정규식에 대한 설명입니다.

  1. ^ 문자열 시작시 어설 션 위치
  2. \w+ 모든 단어 문자와 일치 [a-zA-Z0-9_]
    1. 수량 자 : +가능한 한 여러 번 한 번과 무제한으로 [욕심 많은]
  3. 첫번째 캡처 그룹 (\s\w+)*
    1. 수량 자 : *가능한 많은 횟수로 0에서 무제한 사이에 [욕심 많은]
    2. \s 공백 문자와 일치 [\r\n\t\f ]
    3. \w+ 모든 단어 문자와 일치 [a-zA-Z0-9_]
      1. 수량 자 : +가능한 한 여러 번 한 번과 무제한으로 [욕심 많은]
  4. $ 문자열 끝에 어설 션 위치

2

이것은 처음에 공간을 허용하지 않습니다. 그러나 단어 사이에 공백을 허용합니다. 단어 사이에 특수 문자를 사용할 수도 있습니다. FirstName 및 LastName 필드에 적합한 정규식입니다.

\w+.*$

이 답변은 정확하지 않거나 정확하지 않습니다. 이 패턴은 하나 이상의 영숫자, 밑줄, 개행 문자가 아닌 0 개 이상과 일치합니다. OP에 좋지 않습니다.
mickmackusa

2

알파벳 만 해당 :

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

영숫자 값 및 _:

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

1
(something) +이 (something +)와 같지 않기 때문에 좋은 예는 아닙니다. 첫 번째 예에서는 단일 문자 만 $ 1로 캡처됩니다.
Znik

0

이것을 시도하십시오 : (Python 버전)

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

데이터 세트에 따라 상한을 변경하십시오


0

다음과 같이 정규식 패턴 끝에 공백을 추가하십시오.

[a-zA-Z0-9_ ]

-1

이 많은 답변을 잘 보았습니다 ...

... 그리고 스택 오버플로를 닦은 후 bupkis와 시작 또는 후행 공백이없고 엄격하게 알파 문자 단어 사이에 하나의 공백 이 있는 문자열과 일치하는 정규식에 대한 다른 사이트를 검색 한 후 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]+$단일 단어를 추가로 잡아야 하는 경우 스위치 / if와 다른 것을 간단한 것으로 사용하십시오.)

즐기십시오 : D


3
[(?<=\d\s]일치 한 문자 : (, ?, <, =, 숫자, 또는 공백 문자, 그리고 당신이 무엇을 의미하는지가 될 수 없습니다. 만약 그것이 뒤돌아보기로되어 있다면, 그것은되어야 (?<=\d\s)하지만 , 그것은 의미가 없습니다. 정규식은 절대 일치하지 않습니다.
Alan Moore

지지자에게 : 잘못된 해결책을지지하지 마십시오. 그들은 다른 사용자를 혼란스럽게 만들고 정규식이 할 수없는 일을 할 수 있다고 믿습니다.
Wiktor Stribiżew

-1

이 이름이 "FullName"에 잘 맞는다는 것을 알았습니다.

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

-4

시도해보십시오. *? 공백을 허용하여 나를 위해 일했습니다.


.모든 것과 일치 하기 때문 입니다. 이것은 여기서 해결책이 아닐 가능성이 큽니다.
rubik

이 순서의 앞뒤에 따라 0 또는 모든 문자와 일치합니다. 가능한 적은 일치합니다. 단일 점은 단일 문자를 나타냅니다.
Znik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.