簡體   English   中英

用於匹配或替換subString的正則表達式

[英]Regular expression to get a match or replace a subString

我需要匹配或替換字符串的一部分,如下所示,但我無法在Java中為其編寫確切的正則表達式。

串:

text1${text2${text3}text4}text5

預期的正則表達式應單獨匹配test3。 “內部” $ {}中的所有內容。 上例中有一個外部$ {...}和一個內部$ {...},例如... $ {... $ {...} ...}...。test3位於“內部的$ {}是我想要的。

以下正則表達式捕獲$ {...}中的全部內容,而不僅僅是“內部” $ {...}的內容

\$\{(.*?)\}

更多示例:

text1${text2${text3}text4}text5 - match "text3"
text1text2${text3}text4text5    - should not match anything
text1${text2${text3}text4text5  - should not match anything

更新:

text1${text2${text3}${text4}text5} - match "text3" and "text4"

. 同時匹配{} 您需要排除匹配的{}

\$\{([^{}]*)}
     ^^^^^

參見regex演示 [^{}]*是一個否定的字符類,{}以外的0+個字符匹配。

Java代碼

String str = "text1${text2${text3}text4}text5";
Pattern p = Pattern.compile("\\$\\{([^{}]*)}");
Matcher m = p.matcher(str);
while (m.find()) {
    System.out.println(m.group(1));
}
// => text3

首先 ,你需要匹配第一之間的整個{最后}之后,你可以匹配你想通過比賽組 什么

你想要什么
{.*\\{(.*?)\\}.*?\\}

第一步,它匹配{text2${text3} ,然后您應該使用math-group

我對Java不熟悉,但是對PerlC ++有點了解,我認為它可以在Java中使用,因為它既簡單又不復雜

演示


用Perl測試

echo 'text1${text2${text3}text4}text5' | perl -lne '/\\{.*\\{(.*?)\\}.*?\\}/ && print $1'

產量

text3


因此,在您的Java代碼中使用$1就可以了。


為了您的更新,你寫的,你有2只選擇一個具有loop在你的字符串和其他四個match-group

首先有一個while循環
echo 'text1${text2${text3}${text4}text5}' | perl -lne 'print $2 while /(\\${)(\\w+)(\\$?})/g'
text3
text4
它是如何工作的? 很容易。 它首先匹配${text3} ,這里\\w+將是text3,然后繼續並匹配${text4}然后再次\\w+將是text4
(\\${)(\\w+)(\\$?})
證明

第二個非循環
echo 'your-string' | perl -lne ' /(\\${)(\\w+)(\\$?})\\1(\\w+)\\3/g && print $2," ",$4'

這個也容易。 它首先匹配text3 ,然后匹配text4 ,並將它們放在$2$4 而已。
(\\${)(\\w+)(\\$?})\\1(\\w+)\\3
證明

注意
使用while循環時,您需要使用g標志,並且不能忽略它,但是第二次沒有問題。
再次

暫無
暫無

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

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