Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式奇怪的东西_Java_Regex - Fatal编程技术网

Java正则表达式奇怪的东西

Java正则表达式奇怪的东西,java,regex,Java,Regex,我试过这个。表达式以检索电子邮件地址。由于我对此没有什么经验,我想问你是否知道它有什么问题,因为它是一个单词的两倍: regexp = "(\\w+)(\\(at\\))((\\w+\\.)+)([a-z]{2,3})"; 假设我有一个输入“madrugada(at)yahoo.co.uk”,它将作为一个结果给出madrugada@yahoo.co.co.uk pattern = Pattern.compile (regexp); m = pattern.matcher (my_input);

我试过这个。表达式以检索电子邮件地址。由于我对此没有什么经验,我想问你是否知道它有什么问题,因为它是一个单词的两倍:

regexp = "(\\w+)(\\(at\\))((\\w+\\.)+)([a-z]{2,3})";
假设我有一个输入“madrugada(at)yahoo.co.uk”,它将作为一个结果给出madrugada@yahoo.co.co.uk

pattern = Pattern.compile (regexp);
m = pattern.matcher (my_input);
while (m.find()) {
    for (int i=0; i<=m.groupCount(); i++)
         // it would give out: madrugada (at) yahoo co co uk
}
pattern=pattern.compile(regexp);
m=pattern.matcher(我的输入);
while(m.find()){

对于(int i=0;i您的正则表达式中有一组额外的括号。当您在捕获组中循环时,两个捕获组(其中一个在另一个内)都会返回,因为它们捕获了相同的内容,所以会重复输出

试试这个

regexp = "(\\w+)(\\(at\\))(\\w+\\.)+([a-z]{2,3})";
编辑: 另一个使用非捕获组的正则表达式似乎可以解决这个问题

regexp = "(\\w+)(\\(at\\))((?:\\w+\\.)+)([a-z]{2,3})";

您的正则表达式中有一组额外的括号。当您在捕获组中循环时,两个捕获组(其中一个在另一个内)都会返回,因为它们捕获了相同的内容,所以会复制输出

试试这个

regexp = "(\\w+)(\\(at\\))(\\w+\\.)+([a-z]{2,3})";
编辑: 另一个使用非捕获组的正则表达式似乎可以解决这个问题

regexp = "(\\w+)(\\(at\\))((?:\\w+\\.)+)([a-z]{2,3})";
编辑:

使用非捕获组更新了上述内容。它以前不起作用的原因是,即使它匹配了多个
\w+
模式,反向引用也仅限于最后一个模式。还将accomodate
madrugada(at)yahoo.uk的非捕获组更改为
*

编辑:


使用非捕获组更新了上述内容。它以前不起作用的原因是,即使它匹配了多个
\w+
模式,反向引用也仅限于最后一个模式。还将accomodate
madrugada(at)的非捕获组更改为
*
yahoo.uk

您也不希望包含m.group(0),因为它包含与您的整体RE匹配的整个细分市场

for (int i=1;i<=m.groupCount();i++) {
  System.out.println(m.group(i));
}

for(int i=1;i您也不希望包含m.group(0),因为它包含与您的总体RE匹配的整个段

for (int i=1;i<=m.groupCount();i++) {
  System.out.println(m.group(i));
}

for(int i=1;inow输出stg,如:madrugada@co.uk(所以它只需要在.uk之前加上最后一个字)我相信这个词也可以用:“\w+([-+.]\w+*@\w+([-.]\w+*\。\w+([-.]\w+*””考虑到原始问题中的正则表达式,似乎最好只提取您知道需要的匹配组(1、2、3和5)跳过复制电子邮件地址非TLD部分最后一部分的内部捕获组(4)。谢谢你,John,这是我以前做过的,但我想要更优雅的:)@Madrugada我刚刚有了一个顿悟。如果我们将内部域名捕获组转换为非捕获组,应该可以解决问题。请尝试以下正则表达式:“(\\w+)(\(at\)(?:\\w+\)+)([a-z]{2,3}”;现在它输出stg,如:madrugada@co.uk(所以只需要在.uk之前加上最后一个词)我相信这个词也可以用:“\w+([-+.]\w+”*@\w+([-.]\w+*\.\w+([-.]\w+*”考虑到原始问题中的正则表达式,似乎最好只提取您知道需要的匹配组(1、2、3和5)并跳过该内部捕获组(4)这重复了电子邮件地址非TLD部分的最后一部分。谢谢John,这是我以前做过的,但我想要更优雅的:)@Madrugada我刚刚有了一点洞察力。如果我们将内部域名捕获组转换为非捕获组,应该可以解决问题。请尝试以下正则表达式:(\\w+)(\(at\)((?:\\w+\\)+([a-z]{2,3})”;很抱歉,这更糟:(输出:madrugada@yahoo.coI“我在帖子中编辑了正则表达式,我将第一个匹配排除在外。匹配词以开头。它似乎对meit works起了作用。您同时更改了表达式吗,非常感谢!但对于这一点,它不起作用:madrugada(at)yahoo.co.in.ro.uk.我不明白…这似乎是正确的:(对不起,这更糟:(产出:madrugada@yahoo.coI“我在帖子中编辑了正则表达式,我将第一个匹配词排除在外。匹配词以开头。它似乎对meit起到了作用。你是否同时更改了表达方式,非常感谢!但是它不起作用:madrugada(at)yahoo.co.in.ro.uk。我不明白它…它似乎正确:(