簡體   English   中英

正則表達式匹配器未給出預期結果。 號碼不正確

[英]Regex matcher not giving expected result. Not matching number properly

我不明白為什么第二組只給我0。我希望3000。並且確實指向我可以更好地理解的資源。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {

   public static void main( String args[] ) {
      // String to be scanned to find the pattern.
      String line = "This order was placed for QT3000! OK?";
      String pattern = "(.*)(\\d+)(.*)";

      // Create a Pattern object
      Pattern r = Pattern.compile(pattern);

      // Now create matcher object.
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println("Found value: " + m.group(0) );
         System.out.println("Found value: " + m.group(1) );
         System.out.println("Found value: " + m.group(2) );//?
         System.out.println("Found value: " + m.group(3) );
      }else {
         System.out.println("NO MATCH");
      }
   }
}

精確設置模式,在\\d模式之前添加QT ,或使用.*? 而不是第一個.*以獲取盡可能少的字符。

String pattern = "(.*QT)(\\d+)(.*)";

要么

String pattern = "(.*?)(\\d+)(.*)";

會做。 參見Java演示

(.*QT)(\\\\d+)(.*)將匹配並捕獲第1組中除換行符以外的任何0+字符,並盡可能多地捕獲到第一個QT (最后一個子模式) ),然后將1+個數字匹配並捕獲到組2中,然后將其余的行匹配並捕獲到組3中。

.*? 在替代模式中,將匹配除行換行符以外的任何0+個字符,並將其捕獲到組1中,並盡可能 ,直到第一個1個或多個數字。

您也可以使用更簡單的模式,例如String pattern = "QT(\\\\d+)"; 以獲取QT之后的所有數字,然后結果將在第1組中(您在數字之前和之后將沒有文本)。

*量詞會嘗試盡可能多的匹配,因為它是一個greedy量詞。 通過將其更改為*?可以使其變得非貪婪(惰性) *?

然后,您的正則表達式將變為:

(.*?)(\d+)(.*)

您將在第二個捕獲組中匹配3000

這是一個regex101演示

暫無
暫無

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

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