2011-07-06 3 views
2

정규 표현식과 Java에 익숙하지 않으므로 새 질문을 참아주십시오.자바의 regex api를 사용하여 단어를 삽입하십시오.

"I like ice cream only if it is chocolate ice cream. Chocolate cream" 

과 내가 일치와 일치하는 모든 단어를 대체 할

"chocolate ice cream" 

같은 패턴 : 나는 문자열이있는 경우

:

나는 다음을 수행 할 # 그들을 둘러 쌉니다. 이처럼 :

"I like #ice cream# only if it is #chocolate ice cream#. #Cholcolate cream#" 

나는 자바의 정규 표현식 API를 사용하고 내가 Matcher.replaceAll을 사용할 수 있습니다 이해. 하지만 적절한 정규식을 찾는 데 문제가 있습니다. 나는이 chocolate*\\s*ice*\\s*cream*을 생각해 냈습니다. 하지만 여기서 문제는 전체 하위 문자열과 일치하는 것입니다 (예 : "chocolate ice cream").

chocolate|ice|cream|chocolate ice|ice cream|chocolate cream|chocolate ice cream 

등, 즉 모든 순열하지만, ​​문자열이 성장함에 따라이 성가신 것 :이 같은 뭔가 일할 수있는 것 같아요.

올바른 방향으로 진행하는 데 도움이되는 아이디어가 있으면 고맙겠습니다.

+0

합니까 주문 문제에서 흥미로운 MessageFormat의를 찾을 수 있나요? '아이스 초콜릿 '이 일치하길 원하니? – Qtax

+0

@Qtax 예. "# ice chocolate #" – Panther

답변

7

패턴 사용

(?i)\b((?:chocolate|ice|cream)(?:\s+(?:chocolate|ice|cream))*)\b 

과로 교체 :

#$1# 

데모 :

String s = "I like ice cream only if it is chocolate ice cream. Chocolate cream"; 
s = s.replaceAll("(?i)\\b((?:chocolate|ice|cream)(?:\\s+(?:chocolate|ice|cream))*)\\b", "#$1#"); 
System.out.println(s); 

경계 "크림"(및 기타 단어)의 원인이 단어 교체 할이 아닙니다.

"ice ice""#ice ice#"으로 변경됩니다 (즉 단어가 두 번 이상 나타날 수 있음). @stema는 주석에 언급되어 있습니다.

+1

'크림 아이스크림'과 같은 항목에 맞으면 괜찮습니다. – stema

+0

@stema : "double"단어에 대한 좋은 점! –

3
(?:chocolate|ice|cream)(?:\s+(?:chocolate|ice|cream))* 

이이 시도 공백

+0

그리고 질문에'(? i : chocolate | ice | cream) (? i : \\ s + (?: 초콜릿 | ice | cream))'' – wjans

+0

''ice creamy ''는 이제''#ice cream # y''로 변경 될 것입니다. 아마도 OP가 원하는 것이지만 어쩌면 그렇지 않을 수도 있습니다. –

+0

@Bart 사실, 그걸 잡기위한 해결책에 +1 : –

0

로 구분 지정된 단어 중 하나 이상을 일치 :

final String source = "I like ice cream only if it is chocolate ice cream. Chocolate cream"; 
final String result = source.replaceAll("((?:[Cc]hocolate)?(?:[Ii]ce)?cream)", "#$1#"); 

// Prints I like #ice cream# only if it is #chocolate ice cream#. #Chocolate cream# 
System.out.println(result); 

자세한 내용은 Optional Items를 참조하십시오.

0

어쩌면 당신은 자바 API

Object[] testArgs = {new Long(3), "MyDisk"}; 

MessageFormat form = new MessageFormat(
    "The disk \"{1}\" contains {0} file(s)."); 

System.out.println(form.format(testArgs)); 

// output, with different testArgs 
output: The disk "MyDisk" contains 0 file(s). 
output: The disk "MyDisk" contains 1 file(s). 
output: The disk "MyDisk" contains 1,273 file(s). 
관련 문제