2012-05-04 2 views
1

나는 것은정규 표현식은

입력 -

{foo} 
{bar} 
\{notgood} 
\{bad} 
{nice} 
\{bad} 

출력 -

foo 
bar 
nice 
다음 얻기 위해 정규 표현식을 위해 노력하고 있어요 "{"필터링 "\ {"하지만 수 있도록

{으로 시작하는 모든 문자열을 찾으려고하지만 \{으로 시작하지 않는 문자열을 찾고 싶습니다. 입력으로 5 단어 만 있습니다.

이라는 정규식을 사용하여 {으로 시작하는 모든 단어를 사용했습니다. 나는 \{를 제거하는 방법을 모른다. 어떻게해야합니까?

+0

입력'\\ {foo} '은 어떻게됩니까? –

답변

5

\ 앞에 오는 경우에만 {이 일치하는지 확인하기 위해 negative lookbehind assertion을 사용할 수 있습니다 :

List<String> matchList = new ArrayList<String>(); 
Pattern regex = Pattern.compile(
    "(?<!\\\\) # Assert no preceding backslash\n" + 
    "\\{   # Match a {\n" + 
    "(foo|bar|nice|notgood|bad) # Match a keyword\n" + 
    "\\}   # Match a }", 
    Pattern.COMMENTS); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    matchList.add(regexMatcher.group(1)); 
} 

matchList["foo", "bar", "nice"]입니다.

+0

안녕하세요, Tim 님, 감사합니다. 그것은 완벽하게 작동합니다. –

0

다음 코드와 같이 그위한 '그룹 일치하는'문자열을 사용할 수 있습니다

str.replaceAll("(?<!\\\\)\\{(foo|bar|nice|notgood|bad)\\}", "$1"); 

$1 입력의 첫 번째 () 그룹을 참조 str = "{foo} \{bar} {something}"에 대한

가 줄 것이다 당신 foo \{bar} {something}

+0

죄송합니다. 질문을 수정 한 후에 이것은 관련성이 없습니다 ... –