java 没有字符串顺序的模式匹配

yduiuuwa  于 2023-08-02  发布在  Java
关注(0)|答案(2)|浏览(109)

我想匹配两个字符串,但顺序不重要。例如,下面的检查应该给予true而不是false。

final String line = "LIST \"\" (\"car1\" \"car0\") RETURN (SPECIAL-USE STATUS)\n";
final String regex = ".*LIST.*\\(\"car0\"\\ \"car1\"\\)\\ RETURN.*\\R";
System.out.println(line.matches(regex));

字符串
我期望字符串行中的值应该与正则表达式匹配,而不管单词的顺序(car1和car0)。

rbl8hiat

rbl8hiat1#

你能做到的

final String regex = ".*LIST.*\\((?:\"car1\" \"car0\"|\"car0\" \"car1\")\\) RETURN.*\\R";

字符串
如果您不理解它的含义,您应该熟悉java.util.regex.Pattern的文档。这个链接基本上是你在Java中编写正则表达式的圣经。
如果这对你来说还不够清楚,这里有一个完全相同的字符串的分解视图,但是每个单独的组件都有一个分解。

final String regex = ""
    + ".*"     //wildcard -- anything or nothing can go here.
    + "LIST"   //the literal string LIST in all-caps
    + ".*"     //another wildcard
    + "\\("    //an escaped opening parentheses
    + "(?:"    //the opener of a non-capturing capture group
    + "\""     //an escaped double quote
    + "car1"   //the literal string car1
    + "\""     //another escaped double quote
    + " "      //a single whitespace -- pressing the space bar once
    + "\""     //yet another escaped double quote
    + "car0"   //the literal string car0
    + "\""     //4th double quote thus far
    + "|"      //This is a very special symbol -- when you place this symbol
               //inside of any type of capture group, you should treat it
               //like an or operator in Java if statements
    + "\""     //5th double quote thus far
    + "car0"   //the literal string car0
    + "\""     //6th double quote thus far
    + " "      //another whitespace
    + "\""     //7th double quote thus far
    + "car1"   //the literal string car1
    + "\""     //8th double quote thus far -- it is also the last one
    + ")"      //the closer of the non-capturing capture group started above
    + "\\)"    //an escaped closing parentheses
    + " "      //yet another whitespace
    + "RETURN" //the literal string RETURN in all-caps
    + ".*"     //yet another wildcard
    + "\\R"    //This is a linebreak matcher -- it matches all new line symbols
    ;


有些事情要注意。
1.转义意味着你决定停止解释一个符号的特殊含义,你只想让Java把它放到String中。要转义,请使用反斜杠(\)。不过,你也看到了,逃跑是很棘手的。有时你需要两个反斜杠,有时你需要一个。如果你需要帮助了解何时何地你需要1或2(或更糟的是,更多),我会看看这个链接。
Java Regular Expression - how to use backslash
1.一个捕获组加上一个|symbol允许你在正则表达式中使用OR子句。上面的正则表达式基本上是说,“匹配一个通配符,后跟LIST,后跟另一个通配符,后跟一个左括号,后跟一个 OR CLAUSE,其中以下情况之一必须为真。我们可以匹配文字字符串 “car1”“car0” 或另一个文字字符串 “car0”“car1”。在 OR子句 * 之后,我们匹配一个右括号、一个空格、字符串RETURN、另一个通配符,最后是一个新的行匹配器”。这就引出了我的下一个观点。
1.除了 * 或子句
*,这里的一切都是有序的。这意味着,必须在匹配下一个之前匹配一个。OR子句 * 使您能够在其中一个选项之间进行分支,但仅此而已。否则,一切都遵循按顺序进行的规则。

atmip9wb

atmip9wb2#

regex变量可以写成:

final String regex = ".*LIST.*\\(\"car[1|0]\"\\ \"car[1|0]\"\\)\\ RETURN.*\\R";

字符串

相关问题