簡體   English   中英

以下划線開頭但不包含任何下划線的正則表達式

[英]regular expression that starts with an underscore but not contains any underscore

我試圖從最后一個下划線獲取文件的名稱,直到結束。

例如, ABC_AA.xml應為ABCABC_AASD_AD_AA.xml應為ABC_AASD_AD

我正在考慮使用非貪婪的exlusive ^符號。 我試過這個:

String nameToSearch = testName.replaceAll("_(^(_).)+\\.xml$", "");

如何使用簡單的子串而不是正則表達式

String nameToSearch = testName.substring(0, testName.lastIndexOf('_'));

或者如果沒有_你可以使用

String noSuffix = testName.substring(0, testName.lastIndexOf('.'));//remove ".xml" 
String nameToSearch  = noSuffix.substring(0, testName.lastIndexOf('_'));

但如果你真的想使用正則表達式,那么你可以試試

testName.replaceAll("_[^_]*[.]xml$", "");

它將匹配(並刪除) _具有零個或多個非_字符[^_]*並以.xml結尾。

如果沒有_你可以使用_[^_]*可選

testName.replaceAll("(_[^_]*)?[.]xml$", "");

簡單。

使用組和反向引用,如下所示:

String input = "ABC_AASD_AD_AA.xml";
//                       | using replaceAll to pass regex
//                       |           | group 1: one or more characters, greedy
//                       |           |   | underscore
//                       |           |   || one or more characters, reluctant
//                       |           |   ||  | escaped dot and extension
//                       |           |   ||  |         | back-reference to group 1
System.out.println(input.replaceAll("(.+)_.+?\\.xml", "$1"));

產量

ABC_AASD_AD

注意

任何不符合Pattern輸入都將被退回。

我相信這個正則表達式應該有效:

String repl = str.replaceFirst("_[^_]+$", "");

^字符可以用作“獨占”,即排除某些字符, 作為[]內字符類的第一個字符。 [^_]匹配任何不是下划線的字符。 在方括號之外,它表示“源字符串的開頭”。

所以你很親密。 嘗試這個:

String nameToSearch = testName.replaceAll("_[^_]+\\.xml$", "");

或者,如果要處理以下划線結尾的文件名( ABC_.XML更改為ABC ),並在該情況下刪除下划線,請將+ (1或更多)更改為* (0或更多)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM