2016-06-17 2 views
0

정말 단어를 찾는 Regex를 작성하는 데 어려움을 겪고 있습니다. 그러나 그 단어가있는 행이 시작되지 않는 경우에만 - . 단어에 대한Regex가 일치하지 않는 행에 일치하는 단어를 찾으려면

봐 : 내가 좋아하는 부정적인 lookbehinds를 사용하여 시도

-- check if //should not match 
-- more random words if //should not match 
check if //should match 

경우 : 예를 들어

(?<!-- .*)\bif\b 

그러나 나는 또한 자바를 사용하고있어, 내가 사용할 수 없습니다 lookbehinds의 한정 기호. 내가

(?<! --)\bif\b 

을하려고하면

은 내가 SKIP과 F의 사용을 발견

-- if \\works 
-- if \\does not work 

에 대한 작업을 수행하지만, 자바는이 두 가지를 수용하지 않는 것 같다.

어떻게 해결할 수 있습니까?

감사합니다.

+2

'! line.startsWith ("-") && line.matches ("\\ bif \\ b")'의 문제점은 무엇입니까? 당신이 정규식으로 모든 것을해야한다고 주장함으로써 모든 것을 더 복잡하게 만드는 좋은 이유가 있습니까? – ajb

+0

안녕하세요 @ajb, 나는 여러 단어가 일치하는 여러 줄 문자가 있습니다. 나는 이미 일치해야하는 모든 단어를 반복하는 루프를 가지고있다. text.replaceall을 사용하여 전체 텍스트를 \ n 분할하고 각 줄을 반복 할 필요없이 일치해야하는 각 키워드를 반복합니다. –

+0

@ 타케시 ajb 님의 댓글은 AFAIK에 있습니다. Java의 문자열 연산을 사용하는 것은 간단하고 유지하기가 쉽지만 필요한 정규 표현식은 복잡 할 수 있습니다. –

답변

0

자바 (8)을 사용하는 가정, 당신이 뭔가를 할 수 있습니다 :

Pattern p = Pattern.compile("^(?!--).*if"); 
    Predicate<String> pred = s -> {return p.matcher(s).find();}; 
    Files.lines(Paths.get("files/input.txt")) 
     .filter(pred).forEach(System.out::println); 

그것은 negative look ahead라고합니다. 나는 그것이 도움이되기를 바랍니다.

0

나는 당신의 라인이 얼마나 오래 모르겠지만, 당신은 예를 들어,이 추악한 구성을 사용할 수 있습니다 (물론 숫자가 작을 수) :

(?m)(?<!^--.{0,99999999999999999})if 

EXAMPLE

자바는 약간의 간격 한정사 수 있습니다 뒤에서 봐서 앞을 내다 볼 수는 있지만 잘못 보입니다. P는 작동하지만 적어도이 예제에서는 저에게 적합합니다.

또 다른 접근 방식으로, 모든 발생을 놓치지 않으려면 캡처 그룹을 사용하지 않는 것이 좋습니다. 같은 :

String[] examples = {"-- check if ", 
     "-- more random words if ", 
     "check if ", "-- f", 
     "-- check if \n-- more random words if \ncheck if "}; 
for(String string : examples) { 
    System.out.println(string.replaceAll("(?m)(?!^--)^(.*?)if","$1" + "replacement")); 
    System.out.println(); 
} 

정규식 (?m)(?!^--)^(.*)(if) 단어를 검색까지 모든 것을 일치 1 군으로 캡처됩니다, 다음 raplacement에서 당신은 텍스트로 다시 넣을 수 있습니다. 가장 효율적인 것은 아니지만 어쨌든 작동해야합니다.

+0

이런 식의 코드는 나를 긴장하게 만듭니다. –

관련 문제