【问题标题】:Positive lookahead for exclamation mark感叹号的正向前瞻
【发布时间】:2008-11-15 21:26:01
【问题描述】:

我正在尝试构建一个 Java 正则表达式来匹配“.jar!

问题是我不希望匹配器消耗感叹号。我尝试使用Pattern.compile("\\.jar(?=!)"),但失败了。就像转义感叹号一样。

任何人都可以让它工作还是这是一个 JDK 错误?

更新:我觉得自己像个白痴,Pattern.compile("\\.jar(?=!)") 确实有效。我使用的是 Matcher.matches() 而不是 Matcher.find()。

【问题讨论】:

  • 不要删除,这对可能犯同样错误的其他人仍然有用。
  • 说得对,我先不说了 :)
  • 为了更容易和更不容易出错的 Java 正则表达式,我推荐 myregexp.com 这个站点包含一个用于构建 Java 正则表达式的小程序,它也可以作为 Eclipse 的插件使用。

标签: java regex regex-lookarounds


【解决方案1】:

使用您的正则表达式对我有用(在 Linux 上使用 Sun JDK 1.6.0_02):

import java.util.regex.*;

public class Regex {
        private static final String text = ".jar!";

        private static final String regex = "\\.jar(?=!)";

        public static void main(String[] args) {
                Pattern pat = Pattern.compile(regex, Pattern.DOTALL);
                Matcher matcher = pat.matcher(text);
                if (matcher.find()) {
                        System.out.println("Match: " + matcher.group());
                } else {
                        System.out.println("No match.");
                }
        }
}

打印:

Match: .jar

(没有!)

【讨论】:

  • 您的问题可能是您使用的是 Matcher.matches() 而不是 .find(),这需要整个输入模式匹配。
【解决方案2】:

另外,你可以试试拳击

Pattern.compile("\\.jar(?=[!])")

Java 必须破解:Perl

use strict;
use warnings;


my @data = qw( .jar .jar! .jarx .jarx! );


my @patterns = (
  "\\.jar(?=!)",
  "\\.jar(?=\\!)",
  "\\.jar(?=[!])",
);


for my $pat ( @patterns ){
  for my $inp ( @data ) {
    if ( $inp =~ /$pat/ ) {
      print "$inp =~ $pat \n";
    }
  }
}

->

.jar! =~ \.jar(?=!) 
.jar! =~ \.jar(?=\!) 
.jar! =~ \.jar(?=[!]) 

【讨论】:

  • 它在语义上与问题中的模式没有任何不同。
猜你喜欢
  • 1970-01-01
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多