如何在java正则表达式中写入任何字符串?

时间:2013-10-31 14:53:37

标签: java regex

我有一个文本,我想编写一个正则表达式,以便在第二个@之后提取字符串。例如: @ some text with letter, digit 123 1234 and symbols {[ @text_to_extract。 如何编写正则表达式以在第二个@之后仅提取字符串。这段代码似乎是朝着正确方向迈出的一步:

Pattern p = Pattern.compile("@@(.+?)");
Matcher m = p.matcher("asdasdas@@textToExtract");

@之间的文本为空时,这是有效的,但如何在正则表达式中指定任何文本?

Pattern.compile("@(*)@(.+?)");

编辑:
还有一个条件,文字可以在@@之间,但不一定。

3 个答案:

答案 0 :(得分:4)

  • 不要捕获第一组
  • 将普通*更改为.*
  • 使第二个通配符变得贪婪,因为否则它将只捕获一个字符

Pattern.compile("@.*@(.+)");

答案 1 :(得分:1)

应删除“非贪婪”操作符。 (.*?)应为(.*) ...否则您只匹配第二个@后的文本最小值。绝对需要一个“。”在......面前 *。它意味着“0或更多的前进角色。实际上,也许你想要[^@]*而不是...所以它匹配除了符号之外的任何东西..所以你保证得到一切,即使。不匹配换行。无论如何,这是工作代码。

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.regex.*;

class Ideone {
    public static void main(String[] args) throws java.lang.Exception {
        // Pattern p = Pattern.compile("@(*)@(.+?)");
        Pattern p = Pattern.compile("@.*@(.+)");
        Matcher m = p.matcher("asdasdas@@textToExtract");

        while (m.find()) {
            System.out.println(m.group(1));
        }
    }
}

在此处播放代码:http://ideone.com/rxB5Zy

答案 2 :(得分:0)

你应该这样做

Matcher m =Pattern.compile("^[^@]*@[^@]*@([^@]*)").matcher(input);