2016-07-13 2 views
0

단일 하이픈이 포함 된 단어는 하나로 계산되지만 정규화 된 하이픈은 두 개로 계산됩니다. 현재이게 내가 가지고있는 것입니다 :정규식에 단일 하이픈을 포함하는 정규식

/\b([a-zA-Z0-9’'-])+\b/ 

이 작업을하려면 무엇을 변경해야합니까?

편집 : 명확히하기 위해이 정규식을 사용하여 단어 수를 계산합니다.

예 : 단일 대시 (1 워드) 더블 - 내가 제안으로 부정적 예측을 포함하는 것을 시도했다

대시 (2 워드),하지만 지금은 이중 대시 전에 모든 단어를 igoring 것 (link)

+0

http://stackoverflow.com/questions/12384555/regex-not-to-allow-double-underscores는 속임수 일 수는 있지만 너무 많지는 않습니다. – Terminus

+0

"2로 계산"이란 무엇을 의미합니까? "순진한"단어입니까? "наивный"는 한 마디입니까? – mudasobwa

+0

나는 그것을 더 제한적인 정규 표현식으로 재 작성하려고한다 :'[ '']? \ b [a-zA-Z0-9] + ([ ''-] [a-zA-Z0-9] +) * \ b 그것이 당신이 원하는 것인지 확신 할 수는 없지만. – nhahtdh

답변

1
:

/\A(['’\p{Alnum}]|(-(?!-)))+\z/ 

당신은 여전히 ​​하나의 하이픈에서만 (뜻대로) "단어"일치하는 정규 표현식을 가질 필요 여부, 하나는 명시 적으로 "단어 분리기"입니다 문자, 지정해야

영어 알파벳을 사용하고 영숫자 문자열의 하위 문자열 사이에 최대 한 개의 기호 ([’'-]) 만있을 수 있으며 "기호"의 시작과 끝에는 최대 하나의 기호 만있을 수 있습니다 (질문에 정의 된 "단어").

[’']?\b[a-zA-Z0-9]+(?:[’'-][a-zA-Z0-9]+)*\b[’']? 

테스트 케이스 :

내가 알고있는 것처럼
"Us and Them"’s inclusion on the album The Dark Side of the Moon 
You Am I’s latest CD 
The 69’ers’ drummer, Tom Callaghan (only the second apostrophe is possessive) 
His ’n’ Hers’ first track is called "Joyriders".[18] 
Was She's success greater, or King Solomon’s Mines's? 
Rock 'n' Roll 
’bout for about, ’less for unless, ’twas for it was 
’70s for 1970s 
You-Know-Who 
the fo’c’s’le’s timbers 
Three-hundred-year-old trees are an indeterminate number of trees that are each aged 300 years. 
syl-la-bi-fi-ca-tion 
double--hyphen 

Demo at Rubular

+0

대단히 감사합니다! :) –

1

먼저 \b은 좋은 옵션이 아니며 하이픈 앞뒤의 위치는 \b과 일치합니다.

다음 정규 표현식은 전체 문자열에서 작동합니다. (-(?!-)) 음수 lookahead는 하나의 하이픈과 일치합니다.

re = /(?<![\p{Alnum}'’-])((['’\p{Alnum}]|(-(?!-)))+)(?![\p{Alnum}'’-])/ 
'goo goo-bar goo--bar, goo-bar--baz'.scan(re).map &:first 
#⇒ ["goo", "goo-bar"] 
+0

정규식을 무너 뜨리고 부품을 설명 할 수 있다고 생각하십니까? – jphager2

+0

나는 이미 명백하지 않은 부분 (negative lookahead)을 설명했으며 첫 번째 예제는 두 번째 예제의 일부분이다. – mudasobwa

+0

확인. Regexes 항상 어쨌든 나에게 횡설수설처럼 보입니다. – jphager2

1

, 목적은 두 개의 연속 hypens를 포함하는 두 개의 단어로 간주되어야하는 단어를 계산하는 것입니다. 단일 정규식에서 모든 것을 시도하는 대신 두 개 이상의 연속 된 하이픈의 모든 인스턴스를 공백으로 대체하여 단어를 두 단어로 분리 한 다음 단어를 계산했습니다.

def count_words(str) 
    str.gsub(/-{2,}/, ' ').scan(/[a-zA-Z0-9’'-]+/).size 
end 

데모 용으로 @nhahtdh 테스트 문자열의 일부를 사용합니다.

#=> "\"Us and Them\"’s inclusion on the album The Dark Side of the Moon\nYou Am I’s latest CD\nThe 69’ers’ drummer, Tom Callaghan (only the second apostrophe is possessive)\nHis ’n’ Hers’ first track is called \"Joyriders\".[18]\nWas She's success greater, or King Solomon’s Mines's?\nRock 'n' Roll\n’bout for about, ’less for unless, ’twas for it was\n’70s for 1970s\n" 

count_words(str) #=> 63 

@nhahtdh 이상 str 대해 동일한 개수 (63)를 얻을 @mudasobwa

str =<<BITTER_END 
"Us and Them"’s inclusion on the album The Dark Side of the Moon 
You Am I’s latest CD 
The 69’ers’ drummer, Tom Callaghan (only the second apostrophe is possessive) 
His ’n’ Hers’ first track is called "Joyriders".[18] 
Was She's success greater, or King Solomon’s Mines's? 
Rock 'n' Roll 
’bout for about, ’less for unless, ’twas for it was 
’70s for 1970s 
BITTER_END 
.

관련 문제