2014-12-12 3 views
2

그냥 jollies에 대해 <p> 태그의 모든 단어를 "hodor"로 대체하고 대문자를 보존하고 하이픈이 찍힌 단어를 "ho-dor"로 바꾸는 정규식을 작성하려고합니다.정규식을 사용하여 텍스트

내가 가진 코드는 다음과 같습니다

$("p").each(function() { 
    var $this = $(this), 
     text = $this.text(); 

    text = text.replace(/\b[A-Z][^\b-]*\b/, "Hodor") 
       .replace(/\b[a-z][^\b-]*\b/, "hodor") 
       .replace(/\b[A-Z][^\b-]*-[^\b-]+\b/, "Ho-dor") 
       .replace(/\b[a-z][^\b-]*-[^\b-]+\b/, "ho-dor") 

    $this.text(text); 
}); 

두 질문 :

  1. 이이 하나의 정규식이 아니라 네 중독 모임의 정규 표현식에 함께 할 수 있습니까?
  2. 이 코드는 Hodor가있는 각 단어가 아닌 전체 <p> 텍스트를 단일 "Hodor"로 바꿉니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?
+2

매우 유용 : https://regex101.com/

다음, 문자열 4 번을 교체하는 일이 없도록하기 위해, 당신은 콜백 교체 기능을 사용할 수 있습니다 #javascript (하단에 대체 옵션이 있음). 당신은 예상대로 말의 끝에서 멈추지 않습니다. –

+0

당신은 아마 이것 [code golf] (http://codegolf.stackexchange.com/)에 이것을 가져 가야한다. – Mathletics

답변

5

음 ... \b은 너비가 0 인 어설 션이므로 문자 클래스 내부에는 의미가 없습니다. [^\b-]의 모든 인스턴스를 [^\w-]으로 바꾸면 제대로 작동합니다. 테스트 정규 표현식에 대한

var text = "Hello, world! I am ha-ppy."; 
 

 
text = text.replace(/\b\w+(-\w+)?/g, function(match, secondWord) { 
 
    var isLowerCase = match[0] == match[0].toLowerCase(); 
 

 
    if (secondWord) 
 
     return isLowerCase ? "ho-dor" : "Ho-dor"; 
 
    
 
    return isLowerCase ? "hodor" : "Hodor"; 
 
}); 
 

 
document.write(text); document.close();

+0

나는 하나의 정규식이'function' 대체물을 사용한다는 것을 알았지 만 그것을 시험해보기에는 게으르다. –

관련 문제