1

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

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

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

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

编辑:
还有一个条件,文本可以介于两者之间@@但不是必须的。

4

3 回答 3

4
  • 不要捕获第一组
  • 将平原更改*.*.
  • 使第二个通配符贪婪,否则它将仅捕获单个字符

Pattern.compile("@.*@(.+)");
于 2013-10-31T14:55:49.047 回答
1

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

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

于 2013-10-31T15:03:22.450 回答
0

你应该这样做

Matcher m =Pattern.compile("^[^@]*@[^@]*@([^@]*)").matcher(input);
于 2013-10-31T14:58:57.757 回答