2011-01-07 39 views
2

另一個正則表達式的問題:如何獲得字符串中的一切,但一個特定的模式

我有一個字符串爲以下,

"This is a string, and I have a priority !1"

所以我想建立一個提取的正則表達式我的優先級,就是這個數字1前面有「!」。 提取它非常容易,「!([1-4])」。但是現在我想提取文本,將其排除在外!我怎樣才能做到這一點?

DETAIL:1.可以隨時隨地在字符串中,所以這也是完美的罰款:

"This is a string, !1 and I have a priority"

謝謝!

更新:我使用Scala的

回答

3
(.*?)!([1-4])(.*?) 

此正則表達式使用lazy quantifiers獲得更好的性能,並給你三個捕捉組:

  • 1個標誌之前的文本(實際上,字符串中標記首次出現之前的文本)。
  • 標記本身
  • 標記

您也可以使用類似String.replace()Matcher.appendReplacement()如jarnbjo在他的回答中提到,但在任何情況下,這三組給你你需要什麼下面的文本。

編輯:這裏是正則表達式的正確版本:基於評論

(.*?)!([1-4])(.*) 

,我做了第二個量詞貪婪所以它的字符串的其他部分相匹配。

+0

我想過這個還可以,但後來我不得不後連接幾個組,因爲優先權將不會是唯一的嵌入式模式。 –

+0

如果您有幾個嵌入式圖案,您可以像jarnbjo指出的那樣用replaceAll將它們刪除,但是如果您還需要查找和分析這些模式,那麼您已經必須掃描整個字符串至少一次。 – Yoni

+0

爲什麼你認爲懶惰的量詞使這個正則表達式更高效?在我看來,他們可能會降低績效。另外,第二個「(。*?)」永遠不會匹配任何內容。一個懶惰的量詞作爲正則表達式中的最後一件事情從來就沒有意義;它總是**匹配允許的最小字符數,在這種情況下爲零。 –

3

可以更換1,2,3,4個與空字符串:!!!!

String newString = "some string with !1 and more text".replaceAll("![1-4]", "");

+0

我一直在尋找一個乾淨和可維護的方式來做到這一點.. = D –

+0

你覺得什麼是不容易的?如果有一種方法,第一個參數是外部化的,這對我來說似乎是合理的。但我不知道你的所有要求。 –

+0

@José你想要的字符串,除了'!1'之外,不是嗎?替換將完全做到這一點。這不像字符串是可變的,你不知何故失去了原來的字符串。 –

相關問題