3

我正在尝试匹配某些东西,对于我的生活,我无法弄清楚为什么它不能按预期工作。

细绳:"/*! preserved */"

图案:

Pattern.compile("(/[*][!](?:.+?)[*]/)", Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE)  
- FAIL

图案:

Pattern.compile("(/[*](?:.+?)[*]/)", Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE) 
- PASS

我只想捕捉!在开始评论字符串之后有权利的评论。我什至尝试将比赛减少到/*!

Pattern.compile("(/[*][!])", Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE) 
- FAIL

Pattern.compile("(/[*!]{2})", Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE)
- FAIL

Pattern.compile("(/[*][!])", Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE)
- FAIL


Java Version "1.6.0_43"
Java(TM) SE Runtime Environment (build 1.6.0_43-b01)
Java HotSpot(TM) 64-Bit Server VM (build 20.14-b01, mixed mode)

编辑

这失败了,这对我来说没有意义,因为我的模式没有要求的开始或结束:

Pattern p = Pattern.compile("(/[*]!.+?[*]/)", Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("this is a test /*! preserved */ this is a test /*! preserved1 */");
System.out.println("Pattern: " + p);
System.out.println("Group: " + m.group(1));
System.out.println("Found: " + m.find());

即使将其减少为仅匹配也会/*!失败:

Pattern p = Pattern.compile("(/[*]!)", Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("this is a test /*! preserved */ this is a test /*! preserved1 */");
System.out.println("Match: " + m.find());
System.out.println("Pattern: " + p);
System.out.println("Group: " + m.group(1));
4

3 回答 3

3
    Pattern p = Pattern.compile("(/[*]!.+?[*]/)", Pattern.MULTILINE | Pattern.DOTALL
            | Pattern.CASE_INSENSITIVE);
    System.out.println(p.matcher("/*! preserved */").matches());

输出

true
于 2013-05-12T03:07:52.760 回答
2

取自用于matcher.find().

public boolean find()

尝试查找与模式匹配的输入序列的下一个子序列。此方法在此匹配器区域的开头开始,或者,如果该方法的先前调用成功并且匹配器此后尚未重置,则从前一个匹配不匹配的第一个字符开始。

如果匹配成功,则可以通过startendgroup方法获取更多信息。

回报:

true当且仅当输入序列的子序列匹配此匹配器的模式

Find 从最后一个匹配的结尾开始搜索。不是从字符串的开头。这就是m.find()返回 false 的原因。

您可以通过此示例看到此行为。

Pattern p = Pattern.compile(".*(/[*]!.+?[*]/).*", Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("this is a test /*! preserved */ this is a test /*! preserved1 */");
//System.out.println("Match: " + m.matches());
//System.out.println("Pattern: " + p);
//System.out.println("Group: " + m.group(1));
System.out.println("Found: " + m.find());

这返回真。但是,如果您取消注释其他行,m.find()将返回 false。

如果您m.reset()在调用之前调用m.find(),您将能够判断模式是否在字符串中的任何位置。然而,这会重置匹配器的状态,这可能是不可取的。

编辑:

要仅使用 find 查找所有匹配项,请使用以下代码。(注意缺失.*

Pattern p = Pattern.compile("(/[*]!.+?[*]/)", Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("this is a test /*! preserved */ this is a test /*! preserved1 */");
while(m.find()) {
    System.out.println(m.group());
}

输出

/*! preserved */
/*! preserved1 */

由于Matcher.matches()必须匹配整个字符串,因此您需要一个稍微复杂的正则表达式来查找所有可能不受欢迎的匹配项。

于 2013-05-12T04:36:24.793 回答
-2

一个基于 String API 本身的示例,用于验证密码。

    String password = "Velu1!";
    String pattern = "^(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*+=_-])(?=\\S+$).{6,100}$";
    if (!password.matches(pattern)) {
        System.out.println("Invalid Password!");
    } else {
        System.out.println("Valid Password!");
    }

在这种情况下,您的模式是

  String pattern = "(/[*]!.+?[*]/)";
于 2013-05-12T03:23:19.520 回答