2014-11-29 4 views
2

문장을 단어로 나눌 정규식을 작성하려고합니다. 내 첫 번째 생각은 공백이나 구두점으로 나눠서 "0.5"와 같은 소수로 나누고 싶지 않고 "14:55:02"와 같은 타임 스탬프를 나누고 싶지 않다는 것을 깨달았습니다. 그래서, 부정적인 lookahead와 부정적인 lookbehind로 내 문제를 해결하려했지만, 나는 그들을 함께 넣을 수 없어요 ... 그리고 lookbehind는 자바 스크립트에서 지원되지 않는 것 같습니다. 지금까지점을 구두점으로만 사용하고 숫자는 숫자와 일치하지 않는 자바 스크립트 정규식

내 최고의 시도는 :

JSFiddle

var query = "I've been 0.5 hit at 21:05. I'm okay."; 
var delimiter = /[\s\.,:;?!+=\/\\]+(?![0-9])/g; 

if(delimiter.test(query)){ 

    var words = query.split(delimiter); 
    console.log(words); 

    // ["I've", "been 0.5", "hit", "at 21:05", "I'm", "okay", ""] 
} 
그래서 기본적으로, 나는 [\s\.,:;?!+=\/\\]+ 내 쿼리를 분리하지만 [\.,:/]이 번호로 포장되어있는 경우 분할하지 않는 정규식이 필요합니다. 도와주세요!

+0

이있는'' '일반'.'과'항상 하나의 예에서와 같이, 다음에 공백? – usr2564301

+0

항상 뒤에 공백이 오는 것은 아닙니다. – pmrotule

답변

3

는 여기에 내 걸릴입니다 :

[\s,;?!+=/\\]+|[.:](?!\d)\s* 

Regex101
Fiddle

은 기본적으로 내가 두 경우를 분할하고, 내다보기 만 . 또는 : 후 적용했습니다.

그리고 예, JS는 불행히도 lookbehinds를 지원하지 않습니다.

더 귀찮은 I love pizza.2 more pizzas please! 경우를 들어

, 당신은 분할 대신 일치로 전환해야 할 것 : 그것은 두 자리 사이 인 경우

(?:\d[.:]\d|[^\s.:,;?!+=/\\])+ 

이것은 구분 기호로 . 또는 :을 계산하지 않습니다.

Regex101

그리고 JS에서

:

var query = "I've been 0.5 hit at 21:05. I'm okay. I love pizza.2 more pizzas please!" ; 
 
var re = /(?:\d[.:]\d|[^\s.:,;?!+=\/\\])+/g; 
 
var words = []; 
 
var match; 
 

 
while (match = re.exec(query)) 
 
    words.push(match[0]); 
 
     
 
for (i in words) 
 
    document.getElementById("demo").innerHTML += words[i] + "<br>";
<div id="demo"></div>

+0

작동하지만 왜 문자 클래스 내에서'?','!','+'및'/'를 이스케이프합니까? – usr2564301

+0

@Jongware 당신 말이 맞아요. 나는 질문에서 이것을 복사/붙여 넣기 만하고주의를 충분히 기울이지 않았습니다. –

+0

정말 좋은 해결책입니다. 그러나 두 번째 문장이 '나는 피자를 좋아합니다 .2 더 많은 피자주세요!'와 같은 숫자로 시작하면 효과가 없습니다. 당신은 이것에 대한 개선을 생각합니까? 여전히 이상한 문장입니다 ... – pmrotule