[英]Java regex (java.util.regex). Search for dollar sign
我有一個搜索字符串。 當它包含美元符號時,我想捕獲其后的所有字符,但不包括點或后續的美元符號。后者將構成后續匹配。 因此,對於這些搜索字符串中的任何一個......:
"/bla/$V_N.$XYZ.bla";
"/bla/$V_N.$XYZ;
我想返回:
如果搜索字符串包含百分比符號,我還想返回這對 % 符號之間的內容。
以下正則表達式似乎可以解決這個問題。
"%([^%]*?)%";
推斷:
在某些語言允許%1
、 %2
用於捕獲組的情況下,Java 使用backslash\number
語法。 因此,此字符串編譯並生成 output。
我懷疑美元符號和點需要 escaping,因為它們是特殊符號:
$
通常是字符串的結尾.
是任何字符的元序列。我試過使用雙反斜杠符號.. \
[^\\.\\$%]
%|\\$
試圖結合這種邏輯,似乎無法得到任何可玩的東西。
不知道有沒有另一雙眼睛能看出如何解決這個難題!
到目前為止我的嘗試:
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Main {
public static void main(String[] args) {
String search = "/bla/$V_N.$XYZ.bla";
String pattern = "([%\\$])([^%\\.\\$]*?)\\1?";
/* Either % or $ in first capture group ([%\\$])
* Second capture group - anything except %, dot or dollar sign
* non greedy group ( *?)
* then a backreference to an optional first capture group \\1?
* Have to use two \, since you escape \ in a Java string.
*/
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(search);
List<String> results = new ArrayList<String>();
while (m.find())
{
for (int i = 0; i<= m.groupCount(); i++) {
results.add(m.group(i));
}
}
for (String result : results) {
System.out.println(result);
}
}
}
以下鏈接可能會有所幫助:
您可以使用
String search = "/bla/$V_N.$XYZ.bla";
String pattern = "[%$]([^%.$]*)";
Matcher matcher = Pattern.compile(pattern).matcher(search);
while (matcher.find()){
System.out.println(matcher.group(1));
} // => V_N, XYZ
筆記
\1?
在模式的末尾。 由於它是可選的,因此它不限制匹配上下文並且是多余的(因為否定字符 class 既不能匹配$
也不能匹配%
)[%$]([^%.$]*)
匹配%
或$
,然后將除%
, 之外的任何零個或多個字符捕獲到第 1 組中.
和$
。 您只需要 Group 1 值,因此使用matcher.group(1)
。.
也沒有$
是特殊的,因此,它們不需要[%.$]
或[%$]
中的 escaping 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.