2009-12-25 6 views
0

후속 조치 this question에서 의 두 문자열을 비교할 때 JavaScript에서 쉼표와 세미콜론을 제외한 영숫자가 아닌 문자은 무시하고 대/소문자를 구분하지 않아야합니다. 그래서자바 스크립트 Regex

Times New Roman, Times, Sans-Serif 

일치

Times New Roman,Times,SansSerif    

누군가가 나에게 맞는 기능/접근을 시작 할 수 있나요? JS에서이 작업을 수행 할 준비가되어있는 것이 있습니까? 아니면 두 문자열에서 모든 난장판을 잘라서 비교해야합니까? 두 문자열과 그들을 비교

답변

5

표준화 :

str1.toLowerCase().replace(/[^a-z0-9,;]+/g, "") == str2.toLowerCase().replace(/[^a-z0-9,;]+/g, "") 

다음은 문자열을 소문자로 변환하고 알파벳 문자를 제외한 모든 문자는 쉼표와 세미콜론 비교 전에 제거됩니다.

0

첫 번째 검색 두 문자열을 대체 :

s/[^a-zA-Z0-9,;]+/""/g 

한 다음를 비교합니다.

0

또는이 :

var s1='Times New Roman, Times, Sans-Serif'; 
var s2='Times New Roman,Times,SansSerif'; 


/^(.+){2}$/i.test((s1+s2).replace(/[^\da-zA-Z,;]/g,'')); 
+0

OP의 요구 사항과 일치하지 않습니다. 특히 RE는 세미콜론이나 숫자를 유지하지 않습니다. 또한,'/^(. +) {2} $/i'는 정말 똑똑 할 수도 있지만 "s1 == s2"보다 계산 상 비쌉니다. – gnarf

+0

&& 세미콜론 req를 알려 주셔서 감사합니다. 테스트가 그렇게 영리하지는 않지만 단 하나의 케이스 만이 조건을 충족하므로 테스트를 하나만하면됩니다. replace는 regexp가 작동해야하는 곳이며 두 번 대신 한 번 실행합니다. 소문자로 변환하지 않으면 무언가를 저장해야합니다. – kennebec

+0

당신은'/^(. +) \ 1 $ /'을 의미했습니다.'(. +) {2} '는 2 개의 문자로 된 모든 문자열과 일치한다는 것을 깨달았습니다. 그 변화가 추가되면서, 나는 약간의 성능 테스트를했다. 귀하의 정규 표현식은 gumbos보다 약간 성능이 떨어지며 때로는 제 경험이 없습니다. Gumbo 108, Me 131, You 132. Quadrupling 문자열 크기 Gumbo : 293, Me : 311, You : 415. Quad 문자열 + 1 문자 추가 (대/소문자 구분 없음) s2의 시작 : 너의 것이 503으로 증가하면, 우리는 똑같이 유지된다. 또한 - 당신은'var s1 = 'Times New Roman, Times, Times New Roman'에서 여전히 일치 할 것입니다; var s2 = ', 시간,';' – gnarf

3

검보의 방법 -하지만 읽을 청소기.

function compareStripped(str1, str2) { 
    function strip(str) { 
    // lower case and removes anything but letters, numbers, commas and semi-colons 
    return str.toLowerCase().replace(/[^a-z0-9,;]+/g,''); 
    } 
    return strip(str1) == strip(str2); 
} 
0

제안 된 정규 표현식은 내장 문자 클래스를 사용하여 줄일 수 있습니다. 둘째, 정규화는 평등을위한 테스트와 분리되어야합니다. 여기 내가 일하는 곳에서 코드 리뷰를 통과하지 못할 수도있는 것이 있지만 너무 짧아 내가 게시 할 것이라고 생각했습니다.

String.prototype.normalized = function() { 
return this.replace(/[^\w\d,;]/g,""); 
}; 

var s1='Times New Roman, Times, Sans-Serif'; 
var s2='Times New Roman,Times,SansSerif'; 

if(s1.normalized() == s2.normalized()) document.write("equality!");