2014-02-21 3 views
0

나는 라인을 일치시키고 지우는 regex을 가지고있다. 모든 것이 그 아래에 있으며 (모든 것을 위에 두십시오).정규식에 대해 한 줄로 어떻게 일치합니까?

Two Part Ask: 

1) Why won't this pattern match the given String text below? 
2) How can I be sure to just match on a single line and not multiple lines? 
    - The pattern has to be found on the same single line. 
String text = "Keep this.\n\n\nPlease match junkhere this t-h-i-s is missing.\n" 
      + "Everything should be deleted here but don't match this on this line" + "\n\n"; 
    Pattern p = Pattern.compile("^(Please(\\s)(match)(\\s)(.*?)\\sthis\\s(.*))$", Pattern.DOTALL); 
    Matcher m = p.matcher(text); 
    if (m.find()) { 
     text = (m.replaceAll("")).replaceAll("[\n]+$", ""); // remove everything below at and below "Please match ... this" 
     System.out.println(text); 
    } 

예상 출력 :

이 보관하십시오.

+0

예상되는 출력은 무엇입니까? 어떤 결과물을 받고 있습니까? –

+0

'^'와'$'가 resp와 일치하도록 원한다면. 각 라인의 시작/각 라인의 끝에서'Pattern.MULTILINE'을 사용해야합니다. 'Pattern.DOTALL'은 점과 일치하는 개행을 만듭니다. – fge

답변

2

...

첫째, Pattern.MULTILINE를 사용합니다.

그런 다음, 경기의 시작부터 문자열을 잘라내는, .substring() 사용

final Pattern p = Pattern.compile("^Please\\s+match\\b.*?this", 
    Pattern.MULTILINE); 
final Matcher m = p.matcher(input); 
return m.find() ? input.substring(0, m.start()) : input; 
+0

굉장해! 네, 다중 행렬로 작업하게 만들었습니다. 정규식에 능숙하지 않다. 나는 당신의 해결책을 좋아합니다. 그리고 예. 나는 분명히 내 인생을 복잡하게 만들고있었습니다. =) – JaJ

+0

qq : 왜 앵커 $가 필요하고 \\ b는 필요하지 않습니까? – JaJ

+0

1. 정규식에서 _beginning_과 (과) 일치하는 줄이 나타 났으므로 나머지 입력이 잘 리기 때문에 전체 라인을 일치시킬 필요가 없었습니다. 2. 단어 앵커 (단어의 시작 또는 끝에 일치)입니다. – fge

1

한 줄에 일치 확인 DOTALL를 제거하고 \s" "

Pattern p = Pattern.compile("^(Please()(match)()(.*?) this (.*))$"); 
  • DOTALL는 도트 일치 뉴 라인을 만드는뿐만 아니라
  • \s 새로운 라인을 포함한 모든 공백을 일치시킬 수 있습니다 변환 . 내가 코멘트에 말했듯이 당신은 당신의 인생을 복잡하게하는
+0

감사합니다! DOITALL과 // s 당 의미가 있지만, MULTILINE은 무엇을합니까? (거기에 없더라도)? – JaJ

+0

"xxthisxx"와 같은 입력이있는 경우 어떻게 될까요? 어떻게하면 전체 단어 만 일치시킬 수 있습니까? – JaJ

+0

'MULTILINE'은 여러 줄 입력에서 각 줄을 일치시키기 위해'^'와'$'앵커를 사용할 수 있습니다. – anubhava

관련 문제