3 回答

TA貢獻1854條經驗 獲得超8個贊
在常規中:
def result = "Notification_Group_4+E3".replaceFirst(/_\d\+(.*)/, '_$1')
println result
輸出:
~> groovy solution.groovy
Notification_Group_E3
~>
正則表達式的可視化如下所示:
正則解釋:
我們使用groovy 斜杠字符串
/.../
來定義正則表達式。這使轉義更簡單我們首先匹配下劃線
_
然后我們使用預定義字符類匹配單個數字 (0-9)
\d
,如 java Pattern 類的 javadoc 中所述。然后我們匹配一個
+
字符。我們必須用反斜杠轉義它,\
因為+
在正則表達式中不轉義意味著“一個或多個”(請參閱 javadocs 中的貪婪量詞)。我們不想要一個或多個,我們只想要一個+
角色。然后,我們使用 parens 表達式創建一個正則表達式捕獲組,如java 模式正則表達式的邏輯運算符部分中所述
(.*)
。我們這樣做是為了不被鎖定在以 結尾的輸入字符串中E3
。這樣,輸入字符串可以以任意字符串結尾,并且該模式仍然有效。這實質上是說“捕獲一個組并包含任何字符(即.
in regex)任意次數(即*
in regex)”,這意味著“只捕獲該行的其余部分,無論它是什么”。最后我們替換為
_$1
,即只是下劃線后跟捕獲組捕獲的任何內容。這$1
是對“第一個捕獲組”的“反向引用”,如 java Matcher javadocs中所述。

TA貢獻1780條經驗 獲得超4個贊
簡單的單線:
String res = 'Notification_Group_4+E3'.replaceAll( /_\d+\+/, '_' )
assert 'Notification_Group_E3' == res
添加回答
舉報