Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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,我需要在以下字符串中查找一个人的姓名: TI35635: 71-3463463409 wa36ued i56tle Ro356 IL Involved Subject Name: PETER SMITH Address: 1 MAIN AVE 因此,我应该遵循以下规则:子字符串是“Subject\n+Name:”之后的子字符串,而在“hits\n”之前,我必须遵循此规则,因为原始字符串中我没有发布的某些单词(太长)不能是唯一的 我尝试了以下方法: Pattern

我需要在以下字符串中查找一个人的姓名:

 TI35635: 71-3463463409 wa36ued i56tle Ro356 IL
    Involved Subject
     Name: PETER SMITH
     Address: 1 MAIN AVE
因此,我应该遵循以下规则:子字符串是“Subject\n+Name:”之后的子字符串,而在“hits\n”之前,我必须遵循此规则,因为原始字符串中我没有发布的某些单词(太长)不能是唯一的

我尝试了以下方法:

Pattern patternName = Pattern.compile("(?:Subject.?)(\\n)(Name:.*?)\\n", Pattern.DOTALL);
Matcher matcherName = patternName.matcher(text);
matcherName.find();

请帮助我更正它

您的示例有3组a.e
O(n^3)
其中n是字符数

一般来说,如果我们想多次替换,正则表达式是好的

在你的情况下,正则表达式太贵了。(在我看来)。我将使用以下示例:

String str = "TI35635: 71-3463463409 wa36ued i56tle Ro356 IL\r\n" + 
                "    Involved Subject\r\n" + 
                "     Name: PETER SMITH\r\n" + 
                "     Address: 1 MAIN AVE";

    StringBuilder buff = new StringBuilder();

    for(String line : str.split(System.getProperty("line.separator"))){
        if(line.contains("Name: ")){
            String temp = line.split(": ")[0];
            temp = temp + ": " + "New Name"; 
            buff.append(temp).append("\n");
        }
        else{
            buff.append(line).append("\n");
        }           
    }       

    System.out.println(buff.toString());
输出:

TI35635: 71-3463463409 wa36ued i56tle Ro356 IL
    Involved Subject
     Name: New Name
     Address: 1 MAIN AVE
Name: PETER SMITH
Name = PETER SMITH

您的示例有3个组a.e
O(n^3)
,其中n是字符数

一般来说,如果我们想多次替换,正则表达式是好的

在你的情况下,正则表达式太贵了。(在我看来)。我将使用以下示例:

String str = "TI35635: 71-3463463409 wa36ued i56tle Ro356 IL\r\n" + 
                "    Involved Subject\r\n" + 
                "     Name: PETER SMITH\r\n" + 
                "     Address: 1 MAIN AVE";

    StringBuilder buff = new StringBuilder();

    for(String line : str.split(System.getProperty("line.separator"))){
        if(line.contains("Name: ")){
            String temp = line.split(": ")[0];
            temp = temp + ": " + "New Name"; 
            buff.append(temp).append("\n");
        }
        else{
            buff.append(line).append("\n");
        }           
    }       

    System.out.println(buff.toString());
输出:

TI35635: 71-3463463409 wa36ued i56tle Ro356 IL
    Involved Subject
     Name: New Name
     Address: 1 MAIN AVE
Name: PETER SMITH
Name = PETER SMITH

您可以将名称的正则表达式表示为:

([ \\t\\x0B\\f\\r]*[a-zA-Z]+)*
这表示以下零个或多个序列:零个或多个空格(非换行符),后跟一个或多个字母。应该在较大的正则表达式中处理名称


或者,\s表示空白(尽管它包含换行符),而\w表示任何字母或数字字符。

您可以将名称的正则表达式表示为:

([ \\t\\x0B\\f\\r]*[a-zA-Z]+)*
这表示以下零个或多个序列:零个或多个空格(非换行符),后跟一个或多个字母。应该在较大的正则表达式中处理名称


或者,\s表示空白(尽管它包含换行符),而\w表示任何字母或数字字符。

在尝试匹配包含名称的组之前,只需跳过空白即可。您可以使用
\s
,它不仅可以匹配空格,还可以匹配换行符

Pattern patternName = 
           Pattern.compile("(?:Subject.?)\\s+(Name:.*?)\\n", Pattern.DOTALL);
1
包含:

Name: PETER SMITH

请阅读,以获取由
\s

匹配的字符的完整列表。在尝试匹配包含名称的组之前,只需跳过空白即可。您可以使用
\s
,它不仅可以匹配空格,还可以匹配换行符

Pattern patternName = 
           Pattern.compile("(?:Subject.?)\\s+(Name:.*?)\\n", Pattern.DOTALL);
1
包含:

Name: PETER SMITH

请阅读以获取由
\s

匹配的字符的完整列表。您可以尝试使用正则表达式:

Subject[ ]*\r?\n[ ]*(Name:.*)
e、 g:

输出:

TI35635: 71-3463463409 wa36ued i56tle Ro356 IL
    Involved Subject
     Name: New Name
     Address: 1 MAIN AVE
Name: PETER SMITH
Name = PETER SMITH

您可以尝试使用正则表达式:

Subject[ ]*\r?\n[ ]*(Name:.*)
e、 g:

输出:

TI35635: 71-3463463409 wa36ued i56tle Ro356 IL
    Involved Subject
     Name: New Name
     Address: 1 MAIN AVE
Name: PETER SMITH
Name = PETER SMITH

您只需一行即可完成:

String name = str.replaceAll("(?sm).*Subject\\s+Name:(.*?)?$.*", "$1");
如果找不到名称,结果将为空

我也制作了它,这样它也可以在windows文件上工作


下面是一些测试代码:

String str = " TI35635: 71-3463463409 wa36ued i56tle Ro356 IL\n    Involved Subject\n     Name: PETER SMITH\n     Address: 1 MAIN AVE";
String name = str.replaceAll("(?sm).*Subject\s+Name:(.*?)?$.*", "$1");
System.out.println("Name = " + name);;
输出:

TI35635: 71-3463463409 wa36ued i56tle Ro356 IL
    Involved Subject
     Name: New Name
     Address: 1 MAIN AVE
Name: PETER SMITH
Name = PETER SMITH

您只需一行即可完成:

String name = str.replaceAll("(?sm).*Subject\\s+Name:(.*?)?$.*", "$1");
如果找不到名称,结果将为空

我也制作了它,这样它也可以在windows文件上工作


下面是一些测试代码:

String str = " TI35635: 71-3463463409 wa36ued i56tle Ro356 IL\n    Involved Subject\n     Name: PETER SMITH\n     Address: 1 MAIN AVE";
String name = str.replaceAll("(?sm).*Subject\s+Name:(.*?)?$.*", "$1");
System.out.println("Name = " + name);;
输出:

TI35635: 71-3463463409 wa36ued i56tle Ro356 IL
    Involved Subject
     Name: New Name
     Address: 1 MAIN AVE
Name: PETER SMITH
Name = PETER SMITH


您似乎在
名称:
之前有一堆空白,您没有考虑这些空白。嗯。。。在
“hits\n”
之前?您似乎在
Name:
之前有一堆空白,您没有考虑这些空白。嗯。。。在
“hits\n”
之前?使用字符串拆分和追加操作的问题是,它们要求您创建全新的字符串,这在大型程序中可能会很麻烦。在这里,regex在哪些方面比较昂贵?你能澄清一下吗?正则表达式很贵。如果我想将所有文本替换为HTML/XML的标记,我将使用正则表达式。在一行中替换一个单词-手动方式谢谢您的回答,但是我不能使用
indexOf(“Name:”)
,因为单词名称在原始字符串中不是唯一的(我没有发布所有字符串)。我必须遵守规则:
“Subject+\n+Name:”
@anderivasilev请看我的编辑,我没有使用indexOf。实际上,您的示例有3个组a.e O(n^3),其中n是字符数。使用字符串拆分和追加操作的问题是,它们要求您创建全新的字符串,这在大型程序中可能会很麻烦。在这种情况下,regex在哪些方面比较昂贵?你能澄清一下吗?正则表达式很贵。如果我想将所有文本替换为HTML/XML的标记,我将使用正则表达式。在一行中替换一个单词-手动方式谢谢您的回答,但是我不能使用
indexOf(“Name:”)
,因为单词名称在原始字符串中不是唯一的(我没有发布所有字符串)。我必须遵守规则:
“Subject+\n+Name:”
@anderivasilev请看我的编辑,我没有使用indexOf。事实上,你的例子有3组a.EO(n^3),其中n是字符数;这就是为什么我贴了一个不同的。所以你想要空白,但不要换行,字母,但不要数字或标点符号?好的,很公平。这是否等同于
[\t\x0B\f\ra-zA-Z]*
,还是有一个我不理解的区别?区别在于,在我的中,如果有空格,正则表达式必须至少有一个字母才能匹配。哦,我明白了。您的不能以尾随空格结尾。我现在明白了。谢谢。对不起,我之前的评论误解了你想要实现的目标;这就是为什么我贴了一个不同的。所以你想要空白,但不要换行,字母,但不要数字或标点符号?好的,很公平。这是否等同于
[\t\x0B\f\ra-zA-Z]*
,还是有一个我不理解的区别?区别在于,在我的中,如果有空格,正则表达式必须至少有一个字母才能匹配。哦,我明白了。您的不能以尾随空格结尾。我现在明白了。谢谢。它很好用!!!但是,我有一个小问题,为什么
group()和
group(0)
给出了包含单词
Subject
的相同结果,但是
group(1)
不包含这个单词?
group()
group(0)
基本相同-它们返回完全匹配的
字符串<代码>组(1)
返回在捕获组中出现的第一个
字符串。您的第一组是非捕获组,因此不会出现