如何匹配两个字符之间的任何内容?

时间:2013-04-29 07:17:25

标签: java regex

如何编写与两个特定字符之间的任何内容匹配的正则表达式?

像:

ignore me [take:me] ignore me

如何匹配包含[take:me]

单词take:me是动态的,所以我也希望匹配[123as d:.-,§""§%]

4 个答案:

答案 0 :(得分:4)

您可以使用此正则表达式:

"\\[(.*?)\\]"

link应该可以帮助您了解其工作原理。

Pattern pattern = Pattern.compile("\\[(.*?)\\]");
Matcher matcher = pattern.matcher("ignore me [take:me] ignore me");
if (matcher.find()) {
    System.out.println(matcher.group(1));
}

这将打印take:me


如果你想匹配&([take:me]),你应该使用它:

&\\(\\[(.*?)\\]\\)

并不是说你应该在正则表达式中转义具有特殊含义的字符。 (例如())。

通过添加反斜杠来完成转义,但由于Java中的反斜杠写为\\,因此在任何具有特殊含义的char之前添加\\。所以通过\\(你告诉Java: “(作为常规字符,而不是特殊字符 ”。

答案 1 :(得分:1)

java.util.regex.Matcher 类用于在文本中搜索多次出现的正则表达式。您还可以使用匹配器在不同的文本中搜索相同的正则表达式。

Matcher类有很多有用的方法。有关完整列表,请参阅Matcher类的官方JavaDoc。我将在这里介绍核心方法。以下是所涵盖方法的列表:

创建匹配器

通过Pattern类中的matcher()方法创建匹配器。这是一个例子:

String text    =
    "This is the text to be searched " +
    "for occurrences of the http:// pattern.";
String patternString = ".*http://.*";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);

<强>匹配()

当创建匹配器时,Matcher类中的matches()方法将正则表达式与传递给Pattern.matcher()方法的整个文本进行匹配。这是一个例子:

boolean matches = matcher.matches();

如果正则表达式与整个文本匹配,则matches()方法返回true。如果不是,则matches()方法返回false。

您不能使用matches()方法在文本中搜索多次出现的正则表达式。为此,您需要使用find(),start()和end()方法。

<强> lookingAt()

lookupAt()方法的工作方式与matches()方法的作用有一个主要区别。 lookingAt()方法仅匹配文本开头的正则表达式,而matches()匹配整个文本的正则表达式。换句话说,如果正则表达式匹配文本的开头但不匹配整个文本,则lookingAt()将返回true,而matches()将返回false。

以下是一个例子:

String text    =
    "This is the text to be searched " +
    "for occurrences of the http:// pattern.";
String patternString = "This is the";
Pattern pattern = Pattern.compile(patternString, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(text);
System.out.println("lookingAt = " + matcher.lookingAt());
System.out.println("matches   = " + matcher.matches());

find()+ start()+ end()

find()方法在创建Matcher时搜索传递给Pattern.matcher(text)方法的文本中正则表达式的出现次数。如果在文本中找到多个匹配项,find()方法将找到第一个匹配项,然后对于每个后续调用find(),它将移动到下一个匹配项。

方法start()和end()将索引放入找到的匹配开始和结束的文本中。

以下是一个例子:

String text    =
    "This is the text which is to be searched " +
    "for occurrences of the word 'is'.";
String patternString = "is";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);
int count = 0;
while(matcher.find()) {
  count++;
 System.out.println("found: " + count + " : "
 + matcher.start() + " - " + matcher.end());
}

这个例子将找到模式&#34;是&#34;搜索过的字符串中有四次。打印输出将是:

发现:1:2 - 4

发现:2:5 - 7

发现:3:23 - 25

发现:4:70 - 72

您也可以参考这些教程..

Tutorial 1

答案 2 :(得分:0)

您也可以使用lookaround assertions。这样,括号不包含在匹配中。

(?<=\\[).*?(?=\\])

(?<=\\[)是一个积极的外观断言。确实,当char“[”在比赛之前

(?=\\])是一个积极的先行断言。确实,当char“[”在比赛之后

.*?匹配任何字符零次或多次,但由于修饰符?越少越好。它将matching behaviour of quantifiers从“贪婪”更改为“懒惰”。

答案 3 :(得分:0)

尝试(?<=c)(.+)(?=c) c是您正在使用的角色