【问题标题】:Pattern lookahead模式前瞻
【发布时间】:2011-09-17 16:22:26
【问题描述】:
Pattern p = Pattern.compile("(ma)|([a-zA-Z_]+)");
Matcher m = p.matcher("ma");
m.find();
System.out.println("1 " + m.group(1) + ""); //ma
System.out.println("2 " + m.group(2)); // null
Matcher m = p.matcher("mad");
m.find();
System.out.println("1 " + m.group(1) + ""); //ma
System.out.println("2 " + m.group(2)); // null

但我需要字符串“mad”在第二组中。

【问题讨论】:

    标签: java regex regex-lookarounds


    【解决方案1】:

    我认为您正在寻找的是:

    (ma(?!d))|([a-zA-Z_]+)
    

    来自“perldoc perlre”:

    “(?!模式)” 零宽度负前瞻断言。为了 例子 "/foo(?!bar)/" 匹配任何出现的 "foo" 不是 后跟“条”。

    我唯一不确定的是 Java 是否支持这种语法,但我认为它支持。

    【讨论】:

      【解决方案2】:

      如果您使用matches 而不是find,它将尝试将整个字符串与该模式匹配,这只能通过将mad 放在第二组中来实现:

      import java.util.regex.*;
      
      public class Test {
          public static void main(String[] args) {
              Pattern p = Pattern.compile("(ma)|([a-zA-Z_]+)");
              Matcher m = p.matcher("ma"); 
              m.matches();
              System.out.println("1 " + m.group(1)); // ma
              System.out.println("2 " + m.group(2)); // null
              m = p.matcher("mad"); 
              m.matches();
              System.out.println("1 " + m.group(1)); // null
              System.out.println("2 " + m.group(2)); // mad
          }
      }
      

      【讨论】:

      • 在我的情况下,我无法使用匹配。我想我需要一些东西来展望我的模式。
      • 你能用(ma)$|([a-zA-Z_]+)$吗?这将再次迫使它到达字符串的末尾,find 仍然可以工作。
      • 在我的任务中,我有一个很长的字符串,其中有很多用于这种模式的词位,这就是我使用 find not match 的原因。
      • @itun:如果到目前为止我提供的解决方案都不起作用,也许您可​​以向我们提供更多关于您实际需要做什么的信息?如果您需要匹配字符串中的多个值,请提供一些示例字符串和预期输出。
      猜你喜欢
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      相关资源
      最近更新 更多