2016-04-21 106 views
1

我試圖用這種模式替換,所以我需要匹配這個:爲什麼這種模式不匹配? ([\\ A \\ W]其中[\\ W \\ z])

String pattern = "[\\\\A\\\\W]its[\\\\W\\\\z]"; 

我解釋我的模式的方式是:或者是字符串的開頭,或者是像空格或逗號這樣的非單詞字符,然後是「它的」,然後是非單詞字符或字符串的結尾。

爲什麼它不匹配這個字符串中的「它的」?

its about time 

這是應該做什麼的想法,它應該檢測錯誤地寫入「它」,並將它們修復爲「它」。

此外,爲什麼我需要這麼多的轉義字符,以便模式被vm所接受?

+0

你不需要很多轉義字符:\\ A應該做的伎倆。一個非單詞字符是\ s而不是\ W –

+0

@ Absurd-Mind這就是我最初的想法,但我得到了一個正則表達式編譯錯誤或類似的東西,我在這個答案中找到了這個技巧:http://stackoverflow.com /問題/ 5314018 /刪除文字字符在正則表達式 –

+0

@ArturasM不要打擾手動轉義。嘗試[this](http://www.regexplanet.com/advanced/java/index.html) – Laurel

回答

1

\\A\\z邊界匹配。他們不能進入角色班。如果正確使用它們,即用兩個斜線而不是四個,則正則表達式模式編譯器會拋出異常,因爲\A\z不能進入[]塊內。

使用直|語法而不是用非捕獲組:

String pattern = "(?:\\A|\\W)its(?:\\W|\\z)"; 

Demo.

+0

似乎完美的工作,現在完成我的理解,非捕獲組意味着,你後來無法使用某些東西像1美元,2美元,3美元,對吧?雖然我不知道如何在Java中使用該組的提取,但只能在Perl中使用。 –

+1

@ArturasM對於非捕獲組,您絕對是對的。您可以通過['Matcher'](https://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html)對象獲取組。 '$ n'語法在替換API中起作用,包括'String'的'replaceAll'。 – dasblinkenlight

+0

所以如果我做了「它的時間」.replaceAll(模式,「$ 1」),並且使用了捕獲組而不是非捕獲之前,我會得到在「\\ A | \\ W」中找到的東西, ?如果你能證實這一點,將不勝感激。我還有另外一個問題,那就是爲什麼我們必須在這裏使用非捕獲組?如果我們不打算使用那些「1美元」,「2美元」...,那麼這是出於性能原因嗎? –

相關問題