1

我在获取下面的 java 正则表达式的正确语法时遇到问题。我只想搜索一个字符串,看看它是否包含一段以三个单引号开头并以三个单引号结尾的文本,但它的前面和后面可以有其他文本。三个单引号之间可以存在任何 UTF-8 字符。有什么想法我哪里出错了吗?

          String value="'''<html><head><title>Hello World</title></head><body><div>text</div></body></html>'''";
          Pattern p = Pattern.compile("'''[\\w*]'''");
          Matcher m = p.matcher(value);
          if(m.find()){
              System.out.println("''' found");
          }else{
              System.out.println("''' not found");
          }
4

4 回答 4

3

采用:

Pattern p = Pattern.compile(".*'{3}.*'{3}$");

.*多次表示任何字符(可选)

'{3}表示 3 个单引号

.*多次表示任何字符(可选)

'{3}表示 3 个单引号

$表示字符串的结尾

于 2013-09-12T08:42:17.220 回答
3

有什么想法我哪里出错了吗?

您的正则表达式有两点错误:

  1. 您试图将*量词放在字符类中,而它应该放在外面。
  2. 您正在尝试使用单词字符 (\w) 预定义字符类来匹配诸如 <、> 和 / 等字符,而它只会匹配[a-zA-Z_0-9]. 如果要匹配任何字符,请使用.(任何字符)

将正则表达式更改为Pattern p = Pattern.compile("'''.*'''");应该使您的问题中提供的代码起作用。

其他答案中建议的模式也将提供解决方案。

于 2013-09-12T09:00:03.643 回答
1

试试这个正则表达式:

Pattern p = Pattern.compile("'{3}.*'{3}$");
于 2013-09-12T08:40:21.757 回答
1

我怀疑您想捕获单引号之间的字符串数据。在这种情况下,您使用了错误的括号(您使用[]而不是())。此外,我猜您想使用 a\w*来允许所有可能的内容。但是,\w代表“单词字符”,通常只涵盖[A-Za-z0-9_],这意味着它不涵盖您的 html 字符。

澄清一下:诸如\w不应出现[]括号内的速记字符类。\w*与 相同[A-Za-z0-9_]*,这也表明您的星号量词 ( *) 出现字符类之后,而不是在其中。

然后,您的正则表达式的可用形式将是Pattern.compile("'''(\\w*)'''");. 但是,这不包括 html 字符,例如<.

尝试使用Pattern.compile("'''(.*)'''");, 作为.“所有字符”的代表。

通过使用括号(在这种情况下,它们形成一个捕获组),您可以m.group(1)在调用m.find().

于 2013-09-12T09:06:06.373 回答