【问题标题】:Forward slashes in a JAVA regexpJAVA 正则表达式中的正斜杠
【发布时间】:2013-01-28 00:58:09
【问题描述】:

一般情况: 使用 String.matches("string"); 时,我在匹配“/”时遇到了一些问题; 我想我错过了某种程度的转义。

matches("bar" + "[\\W\\w]*"); //works.
matches("bar/" + "[\\W\\w]*"); //does not work.
matches("bar\/" + "[\\W\\w]*"); //errors
matches("bar\\/" + "[\\W\\w]*"); //does not work
matches("bar\\\\/" + "[\\W\\w]*"); //does not work

我错过了什么?

具体情况:

private static final String CHECK_TABLE_PRE = "<table class=\"data playerStats\">\n <thead>\n  <tr>\n   <th colspan=\"1\" rowspan=\"1\">&nbsp;</th>\n   <th colspan=\"1\" rowspan=\"1\">G</th>\n   <th colspan=\"1\" rowspan=\"1\">A</th>\n   <th colspan=\"1\" rowspan=\"1\">P</th>\n   <th colspan=\"1\" rowspan=\"1\">+/-</th>\n   <th colspan=\"1\" rowspan=\"1\">PIM</th>\n   <th colspan=\"1\" rowspan=\"1\">PPG</th>\n   <th colspan=\"1\" rowspan=\"1\">SHG</th>\n   <th colspan=\"1\" rowspan=\"1\">S</th>\n   <th colspan=\"1\" rowspan=\"1\">S%</th>\n   <th colspan=\"1\" rowspan=\"1\">Shifts</th>\n   <th colspan=\"1\" rowspan=\"1\">TOI</th>\n   <th colspan=\"1\" rowspan=\"1\">FO%</th>\n  </tr>\n</thead>\n<tbody>\n  <tr>";  //want to use this, but the "/" makes it fail
private static final String CHECK_TABLE_POST = "  </tr>\n </tbody>\n</table>"; //Both gotten by copy/pasting from the console.
System.out.println(table.outerHtml().matches("<table class=\"data playerStats\">\n <thead>\n  <tr>\n   <th colspan=\"1\" rowspan=\"1\">&nbsp;</th>\n   <th colspan=\"1\" rowspan=\"1\">G</th>\n   <th colspan=\"1\" rowspan=\"1\">A</th>\n   <th colspan=\"1\" rowspan=\"1\">+" + "[\\W\\w]*" + CHECK_TABLE_POST));
//This works, but I cannot add a add the "/" without getting it to fail.

//Where table = Jsoup.connect("http://www.nhl.com/ice/player.htm?view=log&id=8470598").get().select("table.data.playerStats").get(0);

好的,这是一个更小更独立的示例:

String test = "<table class=\"data playerStats\">\n <thead>\n  <tr>\n   <th colspan=\"1\" rowspan=\"1\">&nbsp;</th>\n   <th colspan=\"1\" rowspan=\"1\">G</th>\n   <th colspan=\"1\" rowspan=\"1\">A</th>\n   <th colspan=\"1\" rowspan=\"1\">P</th>\n   <th colspan=\"1\" rowspan=\"1\">+/-</th>\n   <th colspan=\"1\" rowspan=\"1\">PIM</th>\n   <th colspan=\"1\" rowspan=\"1\">PPG</th>\n   <th colspan=\"1\" rowspan=\"1\">SHG</th>\n   <th colspan=\"1\" rowspan=\"1\">S</th>\n   <th colspan=\"1\" rowspan=\"1\">S%</th>\n   <th colspan=\"1\" rowspan=\"1\">Shifts</th>\n   <th colspan=\"1\" rowspan=\"1\">TOI</th>\n   <th colspan=\"1\" rowspan=\"1\">FO%</th>\n  </tr>\n </thead>\n <tbody>\n  <tr>\n   <td colspan=\"1\" rowspan=\"1\"><a class=\"undMe\" href=\"/ice/recap.htm?id=2012020168\"> Feb 10 '13 </a> BOS @ BUF</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">-1</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">1</td>\n   <td colspan=\"1\" rowspan=\"1\"><span>0.0</span></td>\n   <td colspan=\"1\" rowspan=\"1\">22</td>\n   <td colspan=\"1\" rowspan=\"1\">15:23</td>\n   <td colspan=\"1\" rowspan=\"1\"></td>\n  </tr>\n  <tr>\n   <td colspan=\"1\" rowspan=\"1\"><a class=\"undMe\" href=\"/ice/recap.htm?id=2012020161\"> Feb 9 '13 </a> BUF @ NYI</td>\n   <td colspan=\"1\" rowspan=\"1\">1</td>\n   <td colspan=\"1\" rowspan=\"1\">1</td>\n   <td colspan=\"1\" rowspan=\"1\">2</td>\n   <td colspan=\"1\" rowspan=\"1\">1</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">3</td>\n   <td colspan=\"1\" rowspan=\"1\"><span>33.3</span></td>\n   <td colspan=\"1\" rowspan=\"1\">26</td>\n   <td colspan=\"1\" rowspan=\"1\">21:47</td>\n   <td colspan=\"1\" rowspan=\"1\"><span>100.00</span></td>\n  </tr>\n  <tr>\n   <td colspan=\"1\" rowspan=\"1\"><a class=\"undMe\" href=\"/ice/recap.htm?id=2012020141\"> Feb 7 '13 </a> MTL @ BUF</td>\n   <td colspan=\"1\" rowspan=\"1\">2</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">2</td>\n   <td colspan=\"1\" rowspan=\"1\">-1</td>\n   <td colspan=\"1\" rowspan=\"1\">2</td>\n   <td colspan=\"1\" rowspan=\"1\">1</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">8</td>\n   <td colspan=\"1\" rowspan=\"1\"><span>25.0</span></td>\n   <td colspan=\"1\" rowspan=\"1\">25</td>\n   <td colspan=\"1\" rowspan=\"1\">23:56</td>\n   <td colspan=\"1\" rowspan=\"1\"><span>100.00</span></td>\n  </tr>\n  <tr>\n   <td colspan=\"1\" rowspan=\"1\"><a class=\"undMe\" href=\"/ice/recap.htm?id=2012020132\"> Feb 5 '13 </a> BUF @ OTT</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">-1</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">1</td>\n   <td colspan=\"1\" rowspan=\"1\"><span>0.0</span></td>\n   <td colspan=\"1\" rowspan=\"1\">23</td>\n   <td colspan=\"1\" rowspan=\"1\">20:15</td>\n   <td colspan=\"1\" rowspan=\"1\"></td>\n  </tr>\n  <tr>\n   <td colspan=\"1\" rowspan=\"1\"><a class=\"undMe\" href=\"/ice/recap.htm?id=2012020121\"> Feb 3 '13 </a> FLA @ BUF</td>\n   <td colspan=\"1\" rowspan=\"1\">1</td>\n   <td colspan=\"1\" rowspan=\"1\">2</td>\n   <td colspan=\"1\" rowspan=\"1\">3</td>\n   <td colspan=\"1\" rowspan=\"1\">3</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">1</td>\n   <td colspan=\"1\" rowspan=\"1\"><span>100.0</span></td>\n   <td colspan=\"1\" rowspan=\"1\">24</td>\n   <td colspan=\"1\" rowspan=\"1\">19:15</td>\n   <td colspan=\"1\" rowspan=\"1\"></td>\n  </tr>\n  <tr>\n   <td colspan=\"1\" rowspan=\"1\"><a class=\"undMe\" href=\"/ice/recap.htm?id=2012020109\"> Feb 2 '13 </a> BUF @ MTL</td>\n   <td colspan=\"1\" rowspan=\"1\">1</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">1</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">2</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">1</td>\n   <td colspan=\"1\" rowspan=\"1\">4</td>\n   <td colspan=\"1\" rowspan=\"1\"><span>25.0</span></td>\n   <td colspan=\"1\" rowspan=\"1\">19</td>\n   <td colspan=\"1\" rowspan=\"1\">17:20</td>\n   <td colspan=\"1\" rowspan=\"1\"></td>\n  </tr>\n  <tr>\n   <td colspan=\"1\" rowspan=\"1\"><a class=\"undMe\" href=\"/ice/recap.htm?id=2012020092\"> Jan 31 '13 </a> BUF @ BOS</td>\n   <td colspan=\"1\" rowspan=\"1\">3</td>\n   <td colspan=\"1\" rowspan=\"1\">2</td>\n   <td colspan=\"1\" rowspan=\"1\">5</td>\n   <td colspan=\"1\" rowspan=\"1\">4</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">1</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">4</td>\n   <td colspan=\"1\" rowspan=\"1\"><span>75.0</span></td>\n   <td colspan=\"1\" rowspan=\"1\">21</td>\n   <td colspan=\"1\" rowspan=\"1\">19:21</td>\n   <td colspan=\"1\" rowspan=\"1\"></td>\n  </tr>\n  <tr>\n   <td colspan=\"1\" rowspan=\"1\"><a class=\"undMe\" href=\"/ice/recap.htm?id=2012020079\"> Jan 29 '13 </a> TOR @ BUF</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">1</td>\n   <td colspan=\"1\" rowspan=\"1\">1</td>\n   <td colspan=\"1\" rowspan=\"1\">-1</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">4</td>\n   <td colspan=\"1\" rowspan=\"1\"><span>0.0</span></td>\n   <td colspan=\"1\" rowspan=\"1\">27</td>\n   <td colspan=\"1\" rowspan=\"1\">23:01</td>\n   <td colspan=\"1\" rowspan=\"1\"></td>\n  </tr>\n  <tr>\n   <td colspan=\"1\" rowspan=\"1\"><a class=\"undMe\" href=\"/ice/recap.htm?id=2012020051\"> Jan 25 '13 </a> CAR @ BUF</td>\n   <td colspan=\"1\" rowspan=\"1\">1</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">1</td>\n   <td colspan=\"1\" rowspan=\"1\">-1</td>\n   <td colspan=\"1\" rowspan=\"1\">6</td>\n   <td colspan=\"1\" rowspan=\"1\">1</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">6</td>\n   <td colspan=\"1\" rowspan=\"1\"><span>16.7</span></td>\n   <td colspan=\"1\" rowspan=\"1\">22</td>\n   <td colspan=\"1\" rowspan=\"1\">17:55</td>\n   <td colspan=\"1\" rowspan=\"1\"></td>\n  </tr>\n  <tr>\n   <td colspan=\"1\" rowspan=\"1\"><a class=\"undMe\" href=\"/ice/recap.htm?id=2012020043\"> Jan 24 '13 </a> BUF @ CAR</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">2</td>\n   <td colspan=\"1\" rowspan=\"1\">2</td>\n   <td colspan=\"1\" rowspan=\"1\">-1</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">2</td>\n   <td colspan=\"1\" rowspan=\"1\"><span>0.0</span></td>\n   <td colspan=\"1\" rowspan=\"1\">21</td>\n   <td colspan=\"1\" rowspan=\"1\">18:45</td>\n   <td colspan=\"1\" rowspan=\"1\"></td>\n  </tr>\n  <tr>\n   <td colspan=\"1\" rowspan=\"1\"><a class=\"undMe\" href=\"/ice/recap.htm?id=2012020023\"> Jan 21 '13 </a> BUF @ TOR</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">1</td>\n   <td colspan=\"1\" rowspan=\"1\">1</td>\n   <td colspan=\"1\" rowspan=\"1\">2</td>\n   <td colspan=\"1\" rowspan=\"1\">2</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">3</td>\n   <td colspan=\"1\" rowspan=\"1\"><span>0.0</span></td>\n   <td colspan=\"1\" rowspan=\"1\">23</td>\n   <td colspan=\"1\" rowspan=\"1\">18:52</td>\n   <td colspan=\"1\" rowspan=\"1\"></td>\n  </tr>\n  <tr>\n   <td colspan=\"1\" rowspan=\"1\"><a class=\"undMe\" href=\"/ice/recap.htm?id=2012020014\"> Jan 20 '13 </a> PHI @ BUF</td>\n   <td colspan=\"1\" rowspan=\"1\">2</td>\n   <td colspan=\"1\" rowspan=\"1\">3</td>\n   <td colspan=\"1\" rowspan=\"1\">5</td>\n   <td colspan=\"1\" rowspan=\"1\">1</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">1</td>\n   <td colspan=\"1\" rowspan=\"1\">0</td>\n   <td colspan=\"1\" rowspan=\"1\">9</td>\n   <td colspan=\"1\" rowspan=\"1\"><span>22.2</span></td>\n   <td colspan=\"1\" rowspan=\"1\">26</td>\n   <td colspan=\"1\" rowspan=\"1\">19:17</td>\n   <td colspan=\"1\" rowspan=\"1\"><span>100.00</span></td>\n  </tr>\n </tbody>\n</table>";
System.out.println(test.matches("<table class=\"data playerStats\">\n <thead>\n  <tr>\n   <th colspan=\"1\" rowspan=\"1\">&nbsp;</th>\n   [\\w\\W]*"));
System.out.println(test.matches("<table class=\"data playerStats\">\n <thead>\n  <tr>\n   <th colspan=\"1\" rowspan=\"1\">&nbsp;</th>\n   <th colspan=\"1\" rowspan=\"1\">G</th>\n   <th colspan=\"1\" rowspan=\"1\">A</th>\n   <th colspan=\"1\" rowspan=\"1\">P</th>\n   <th colspan=\"1\" rowspan=\"1\">+/-[\\w\\W]*"));
System.out.println(test.matches(test));

//Console return "true \n false \n false" (without the spaces).

好的,请耐心等待。更短的例子:

String test = "foo+/-bar";
System.out.println(test.matches("foo+[\\w\\W]*"));
System.out.println(test.matches("foo+/[\\w\\W]*"));
System.out.println(test.matches("foo+/-bar[\\w\\W]*"));
System.out.println(test.matches(test));
//true false false false
//But if I leave out the +-, so that String test = "foo/bar"; (and change the rest of the example accordingly) the whole example work (returns true).

所以,“+/”有点奇怪。也许我必须逃避加号。

【问题讨论】:

  • 不需要转义'/',matches("bar/[\\W\\w]*"); 应该没问题。或者把 SSCCE 放在这里让你的问题更清楚。
  • 是的,这是优点。将“+/-”更改为“\\+/-”修复了它。
  • 您可以发现Java regex 中必须“引用”这些字符:docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html,如果您不确定某个字符是否必须转义,可以将其放入[],例如@ 987654328@.

标签: java regex escaping slash


【解决方案1】:

无需在 JAVA 中转义 /

matches() auto-anchors* ^$ 的模式。

".*bar/.*" 应该适合您的需求。


* String#matches() 调用 Pattern#matches(),后者调用 Matcher#matches()which explains that true 返回当且仅当整个区域序列匹配此匹配器的模式。 p>

【讨论】:

    【解决方案2】:

    所以,“+/”有点奇怪。也许我必须逃避加号。

    是的,你知道。正则表达式中的+ 表示前面的一个或多个,因此要匹配文字加号,您需要正则表达式中的\+,这意味着Java 字符串文字中的\\+

    test.matches("foo\\+/-bar[\\w\\W]*"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 2011-03-09
      • 2015-03-15
      • 1970-01-01
      • 2012-02-25
      相关资源
      最近更新 更多