簡體   English   中英

Java 正則表達式(java.util.regex)。 搜索美元符號

[英]Java regex (java.util.regex). Search for dollar sign

我有一個搜索字符串。 當它包含美元符號時,我想捕獲其后的所有字符,但不包括點或后續的美元符號。后者將構成后續匹配。 因此,對於這些搜索字符串中的任何一個......:

"/bla/$V_N.$XYZ.bla";
"/bla/$V_N.$XYZ;

我想返回:

  • V_N
  • XYZ

如果搜索字符串包含百分比符號,我還想返回這對 % 符號之間的內容。

以下正則表達式似乎可以解決這個問題。

 "%([^%]*?)%";

推斷:

  • 以 % 開頭和結尾,
  • 有一個捕獲組 - ()
  • 有一個字符 class 包含除 % 符號以外的任何內容,(插入符號推斷不是字符)
  • 重復 - 但不是貪婪*?

在某些語言允許%1%2用於捕獲組的情況下,Java 使用backslash\number語法。 因此,此字符串編譯並生成 output。

我懷疑美元符號和點需要 escaping,因為它們是特殊符號:

  • $通常是字符串的結尾
  • . 是任何字符的元序列。

我試過使用雙反斜杠符號.. \

  • 都作為字符類。例如[^\\.\\$%]
  • 並使用OR'd符號%|\\$

試圖結合這種邏輯,似乎無法得到任何可玩的東西。

不知道有沒有另一雙眼睛能看出如何解決這個難題!

到目前為止我的嘗試:

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

請參閱Java 演示正則表達式演示

筆記

  • 您不需要可選的\1? 在模式的末尾。 由於它是可選的,因此它不限制匹配上下文並且是多余的(因為否定字符 class 既不能匹配$也不能匹配%
  • [%$]([^%.$]*)匹配%$ ,然后將除% , 之外的任何零個或多個字符捕獲到第 1 組中. $ 您只需要 Group 1 值,因此使用matcher.group(1)
  • 字符 class中,既不是. 也沒有$是特殊的,因此,它們不需要[%.$][%$]中的 escaping 。

暫無
暫無

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

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