我有一个文本,我想编写一个正则表达式,以便在第二个@
之后提取字符串。例如:
@ some text with letter, digit 123 1234 and symbols {[ @text_to_extract
。
如何编写正则表达式以在第二个@
之后仅提取字符串。这段代码似乎是朝着正确方向迈出的一步:
Pattern p = Pattern.compile("@@(.+?)");
Matcher m = p.matcher("asdasdas@@textToExtract");
当@
之间的文本为空时,这是有效的,但如何在正则表达式中指定任何文本?
Pattern.compile("@(*)@(.+?)");
?
编辑:
还有一个条件,文字可以在@
和@
之间,但不一定。
答案 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);