2013-08-05 162 views
3

我需要檢查有以下模式中的任一線路:正則表達式與Java

preposition word ||| other words or what ever 
word preposition ||| other words or what ever 

介詞可以像{日,A,倒水,quand一個列表中的任何的一個詞。 ..} 這個詞可能是介詞與否。

我嘗試了許多模式,如下面

File file = new File("test.txt"); 
Pattern pattern = Pattern.compile("(\\bde\\b|\\bà\\b) \\w.*",Pattern.CASE_INSENSITIVE);   
String fileContent = readFileAsString(file.getAbsolutePath());   
Matcher match = pattern.matcher(fileContent); 
System.out.println(match.replaceAll("c")); 

該圖案匹配介詞接着管之前至少一個詞。我想要的是匹配一個介詞,然後在管道前面只有一個單詞。我嘗試了以下模式

Pattern pattern = Pattern.compile("(\\bde\\b|\\bla\\b)\\s\\w\\s\\|.*",Pattern.CASE_INSENSITIVE); 

不幸的是,這種模式不起作用!

+1

也許在'\\ w'後面加上'+'。 Singe'\\ w'表示一個字母數字字符,使它與\\ w +'匹配一個或多個字母數字字符。 – Pshemo

+1

[here](http://gskinner.com/RegExr/)是一個可能有幫助的網站。它有點像正則表達式的文本編輯器(可以在互聯網上找到許多其中之一)。不是你的問題的答案,但它可能會有所幫助 – scottyseus

+2

你能否給我們提供一個所需行爲(輸入/輸出)的簡單例子? –

回答

1

爲了簡潔起見,我只是將使用prep站在爲我們可以處理一個介詞:

Pattern pattern = Pattern.compile("(?:(?:\\bprep\\b \\w+)|(?:\\w+ \\bprep\\b)).*", 
           Pattern.CASE_INSENSITIVE);  

(?:...)說要組,但做捕獲
\\bprep\\b確保prep匹配僅當它是單獨的,即它不會匹配爲preposition
\\w+要求1以上[a-zA-Z_0-9]
.*末去與這兩個組括號

編輯的(在響應評論):
"^(?:(?:\\bprep\\b \\w+)|(?:\\w+ \\bprep\\b)).*"工作,你只是最有可能運行到您擁有的情況下是這樣的:

String myString = "hello prep someWord mindless nonsense"; 

會因爲這比賽是由第二種情況下拍攝的:(?:\\w+ \\bprep\\b)).*

如果你嘗試這些,你會看到^其實工作:

String myString = "egeg prep rfb tgnbv"; 

這並不第二種情況下,因爲有2位"egeg"後匹配,所以它只能匹配第一,但它不是由於^。另外:

String myString = "egeg hello prep rfb tgnbv"; 

我們已經建立,像這樣的情況下,將不匹配的第一個,也不會匹配第二個,這意味着^其實工作。

+0

@Dorsaf除了你沒有理由捕捉。這就是爲什麼我建議'(?:...)'。 –

+0

是的,你是對的。這很好,除了我無法將搜索限制在行的開頭,我嘗試了'^(?:(?:\\ bprep \\ b \\ w +)|(?:\\ w + \\ bprep \\ b))。*'然而,這是行不通的! – Dorra

+0

@ Steve P.我明白了爲什麼^不適合我。這是因爲我把所有正在閱讀的文件放在一個字符串中。我必須逐行讀取它,並分別處理每個字符串。現在工作正常,謝謝 – Dorra

0

謝謝大家的回答。實際上,正如@Pshemo所說的,我只需要在\ w之後加上+。我認爲\ w表示單詞。現在它用下面的代碼:

File file = new File("test.txt"); 
Pattern pattern = Pattern.compile("(\\bde\\b|\\bla\\b)\\s\\w+\\s\\|.*|\\w+\\s(\\bde\\b|\\bla\\b)\\s\\|.*",Pattern.CASE_INSENSITIVE) 
String fileContent = readFileAsString(file.getAbsolutePath());   
Matcher match = pattern.matcher(fileContent); 
System.out.println(match.replaceAll("")); 

至於例如輸入,我有follwong線:

世界|||這裏的東西在這裏|||其他事情

世界約| || something here |||其他東西在這裏

另一個例子|||這裏的東西|||這裏其他的東西

決賽和最後一個例子|||這裏的東西在這裏|||其他事情

然後,假設介詞的列表爲{中,大約},將出將會是:

另一個例子|||這裏的東西|||這裏其他的東西

決賽和最後一個例子|||這裏的東西在這裏

正如你看到的,我只是想匹配的兩個第一線,並刪除它們|||其他的事情。