2016-11-16 3 views
0

특정 ID가 포함 된 특정 행 (예 : * AUY)의 단어 수를 계산하고 싶습니다. 지금까지 나는 선을 찾기 위해 아래의 정규식을 사용하여 시도했지만 그것은특정 단어로 시작하는 행의 단어 수를 계산하십시오.

*AUY: today is holiday so Peter and Mary do not need to go to work . 
%mor: n|today cop|be&3s n|holiday conj|so n:prop|Peter conj|and n:prop|Mary v|do neg|not v|need inf|to v|go prep|to n|work . 
%snd: <00:00:00><00:07:37> 
%AUY: ok_pfp (0.40) er today is holiday errfr ::: so er Peter and Mary {is} ~ er do not need errfr ::: to go to work . errfr :;:a | 

결과는 첫 번째해야 제가 테스트 문자열 아래에있는

^ *(.*\b(?:\\*AUY)\b.*) *$ 

시작 부분에 "*"를 고려하지 않습니다 문자열이지만 결과 일치의 첫 번째와 마지막 문자열을 반환합니다. 이 Rubular

+1

질문을 좀 더 명확하게 할 수 있습니까? 당신이 제공 한 테스트 문자열에서 무엇을 추출하려고합니까? – MYGz

+0

그냥'string.split ('') .length' – Rajesh

+0

당신의 스크립트는 문자열을 일치 시키려고하지만, 단어를 계산하지 않습니다. 문자열을 일치시키기 위해서 필요한 것은'^ \ * AUY. *'입니다. 이 모든 것이 당신이 찾고있는 것입니까? 문자열에있는 단어의 수를 계산하려고 시도한 코드는 무엇입니까? –

답변

2

그 시도를 참조하십시오 :

/^.*?\*AUY:(.*?)$/gmi 

Explanation

  1. 이^라인
  2. 의 시작 위치를 주장 *.? 모든 문자와 일치합니다 (라인 종결 자 제외)
  3. *? 정량 - 제로 제한 시간 (지연) 사이의 일치
  4. \ * 문자 *
  5. AUY 일치 : 문자 AUY
  6. * 일치합니다.? 모든 문자와 일치합니다 (행 종결 자 제외).
  7. $는 행 끝의 위치를 ​​지정합니다.
  8. g 수정 자 : 전역입니다. 첫 번째 경기 후 돌아 오지 않는다.
  9. m 수정 자 : 멀티 라인. 그리고 $ 각 줄의 시작/끝과 일치하는
  10. 전 수정 (뿐만 아니라/문자열의 끝에 시작)^원인 : 문자 구분을

Rubular

코드 샘플 :

function countWord(){ 

const regex = /^.*?\*AUY:(.*?)$/gmi; 
const str = `*AUY: today is holiday so Peter and Mary do not need to go to work . 
%mor: n|today cop|be&3s n|holiday conj|so n:prop|Peter conj|and n:prop|Mary v|do neg|not v|need inf|to v|go prep|to n|work . 
%snd: <00:00:00><00:07:37> 
%AUY: ok_pfp (0.40) er today is holiday errfr ::: so er Peter and Mary {is} ~ er do not need errfr ::: to go to work . errfr :;:a |`; 
let m; 

while ((m = regex.exec(str)) !== null) { 
    // This is necessary to avoid infinite loops with zero-width matches 
    if (m.index === regex.lastIndex) { 
     regex.lastIndex++; 
    } 
    alert(m[1].match(/\b(\w+)\b/g).length); 
} 

    } 
+0

Thanku Maverick, 작동했습니다. 그러나이 모든 일치하는 줄을 반복하여 단어를 세어 그 안에? –

+0

@BilalHussain 귀하의 질문에 더 분명해야했다, 이제는 당신이 AUY 후 단어의 개수를 계산하려는 이해했습니다 : 내 업데이트 된 샘플 코드를 조심하십시오 –

+0

고맙습니다 soo 내가 정확히 무엇을 찾고 있었는지 코디 : –

0

다음 정규 표현식을 사용하십시오.

(^.*\*AUY.*$) 

수 있습니다. check it here

3

x을 문자열로 사용하십시오. Then

문자열 '* AUY'로 시작하는 각 행에서 단어와 유사한 구문의 수를 배열로 반환합니다.

설명 :

정규 표현식 문자열을 찾습니다

* 문자열의 시작 부분에 AUY 직접 그 라인의 시작 부분에없는 경우에도 행의 시작 부분에있는 줄 바꿈 (즉, 후 문자열) 및 * AUY의 첫 번째 토큰 (즉, 해당 행의 나머지 부분) 다음에 오는 비 CRLF 문자를 포함 할 수 있습니다.

일치가 수행 된 후에 || [] 관용구는 일치 값이 null 인 경우 빈 배열을 반환하므로 Null 값 대신 배열이 필요하면 오류를 방지합니다.

최종 단계 .map은 일치하는 배열의 각 요소에 대해 연산을 수행하고 공백이 아닌 일치를 계산하고이 개수를 새 배열로 반환합니다. 이 행을 || [] 관용구로 보호하지 않아도된다는 점에 유의하십시오. 행에 최소한 공백이 아닌 문자열 * AUY가 포함되어 있기 때문에 null 일치가 불가능하기 때문입니다.

실제로이 작업을 수행하기위한 출발점으로이 코드를 사용할 수 있습니다. 행운을 빕니다!

+0

Thanku Joesph는 큰 도움이되었지만 "* AUY :"뒤에 문자를 세고 싶습니다. 바로 지금이 문자열 ("↵ * AUY : \t 갑자기 그녀는 소리를 지르며 전구가 타 오르고 있다고 말했습니다.")와 일치하는 것으로 나타났습니다. –

+0

@BilalHussain Lol, 오신 것을 환영합니다! 'return s.match (/ \ S +/g) .length - 1'. 1을 뺍니다. –

관련 문제