有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用JAVA的正则表达式问题

经过一周的网络搜索和尝试不同的方法,我放弃了。 我在Java中遇到了一个关于正则表达式的问题,我想知道是否可以在这里找到一些帮助

我试图在一个巨大的字符串中找到这个"< < < < 06 76 > > "模式,我必须搜索它。 我知道的是,在最后一个"<"和第一个">"之间,最后一个">"和第一个"<"之间只能有数字类型的字符和任意数量的空格。此外,每个"<"">"之间可以有1到5个空格。 我能够创建一个模式的一部分用于搜索,但我不能从那里继续前进。 下面是我能够创建的搜索模式

        String tag_open = "<\\s{0,4}<\\s{0,4}<\\s{0,4}<\\s{0,4}";

我一直在尝试加入“任何数字,不超过4位,由1到5个空格分隔”的概念

最后,我能够“关闭”要搜索的模式

"\\s{0,4}>\\s{0,4}>\\s{0,4}"

对不起,我的文字太长了。我正在尽可能详细地说明。 非常感谢! 问候

我想我忘了说什么了。。。我真的。。。有两种类型的“标签”,我必须寻找。。。一个是“06 76”第二个是“39 85”。其中,每个“<;”之间的空间量及“>;”可以是1到4,并且最后一个“<;”之间的空格量相同和第一个数字字符。在最后一个数字字符和第一个“>;”之间也是如此。最后,从数字之间的1到6个空格

好的。。。希望这是我最后一次编辑。:-) 我必须找到这两种标签的位置,这两种标签将显示每个段落的行乞和结尾。该段的行乞由以下模式确定: 段落开头:四个“<;<;<;”*+一些空格+2个随机数字+一些空格+2个随机数字+一些空格+2“>;”*

  • 在“<及“>;”可以在1到4个空格之间

段落末尾:两个“<;”*+一些空格+2个随机数字+一些空格+2个随机数字+一些空格+4“>;>;>;>;”*

  • 在“<及“>;”可以在1到4个空格之间

以下是文本段落的示例:

<<<&书信电报;06 76>&燃气轮机; Lorem ipsum dolor sit amet,是一位杰出的献身者。不要坐在阿梅特·莫里斯·洛伦旁边。这是一个很好的例子。维尼那提维尼阿莫斯大教堂(Vivamus venenatis diam sit amet Element um sollicitudin)。库拉比图尔尼布斯泰勒斯酒店。前庭前置器直径。这是一个很好的例子,它是一个很好的例子。这是一个很好的例子。整型达比布斯,奥迪奥·阿朗库斯·波特托尔,舌苔,在塞姆佩尔·麦格纳·阿库·阿莫里斯(semper magna arcu a mauris)。伏隔前庭。库拉比图尔是一个莫利斯人,一个乌兰科人。Donec urna nibh,前庭和孕期,posuere id Elite。这是一只大羚羊。 <&书信电报;06 76>&燃气轮机&燃气轮机&燃气轮机

<<<&书信电报;12 23>&燃气轮机; Morbi aliquet调味品tempus。金丝雀花。文胸文胸。我是马克西姆斯·多洛。潜力悬钩子。塞德奎斯猫。塞德·马格纳·莫里斯,马蒂斯·非密苏里,莫利斯·波苏尔·马萨。根据康努比亚·诺斯特拉(conubia nostra)和希梅纳奥斯(inceptos himenaeos)的规定,社会责任和责任等级为:。智者名言(Suspendisse dictum sapien bibendum ultricies)。埃吉斯塔斯悬钩子、舌苔、流苏。纳拉姆和奥迪奥精英。佩伦茨克(Nullam Pellentsque nunc tellus),法雷特拉(vitae pharetra lorem congue id)。 <&书信电报;12 23>&燃气轮机&燃气轮机&燃气轮机

再次为这篇冗长的文章和最后一分钟的编辑道歉


共 (2) 个答案

  1. # 1 楼答案

    你可以用

    <(?:\s{1,5}<)*\s*(?:\d+\s*)+>(?:\s{1,5}>)*
    
    • <逐字匹配
    • (?:\s{1,5}<)*重复0+次匹配1-5个空格字符,后跟<
    • \s*匹配可选的空白字符
    • (?:\d+\s*)+匹配1+次匹配1+位和可选空白字符
    • >逐字匹配
    • (?:\s{1,5}>)+重复0+次匹配1-5个空格字符,后跟>

    Regex demoJava demo

    注意\s也可以匹配换行符。在Java中,您还可以使用\h{1,5}来匹配水平空白字符

    Java中的示例:

    String regex = "<(?:\\s{1,5}<)*\\s*(?:\\d+\\s*)+>(?:\\s{1,5}>)*";
    String string = "< < < <      06   76           > >\n"
    + "< < < <                 > >\n"
    + "< < < <      06   76  >\n"
    + "< < < <      06   76  \n";
    
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(string);
    
    while (matcher.find()) {
        System.out.println(matcher.group(0));
    }
    

    输出

    < < < <      06   76           > >
    < < < <      06   76  >
    

    编辑

    段落开头的模式

    <(?:\s{1,4}<){3}(?:\s*\d\d){2}\s*>\s{1,4}>
    

    Regex demo

    段落结尾的模式

    <\s{1,4}<(?:\s*\d\d){2}\s*>(?:\s{1,4}>){3}
    

    Regex demo

    例如,如果希望获取段落内容,可以使用捕获组

    <(?:\s{1,4}<){3}(?:\s*\d\d){2}\s*>\s{1,4}>([\s\S]*?)<\s{1,4}<(?:\s*\d\d){2}\s*>(?:\s{1,4}>){3}
    

    Regex demo

  2. # 2 楼答案

    像这样的

    String input = "<  <       <      < 06  76    >         > ";
    
    //For all tags
    Pattern pat = Pattern.compile("(< +)+([0-9]+ +)+(> +)+");
    
    //For tag < < < < 06 76 > >
    //Pattern pat = Pattern.compile("(< +){4}([0-9]+ +)+(> +)+");
    
    //For tag < < 39 85 > > > >
    //Pattern pat = Pattern.compile("(< +){2}([0-9]+ +)+(> +)+");
    
    Matcher mat = pat.matcher(input);
    
    while(mat.find()) {
        System.out.println(mat.group());
    }
    
    //Prints:
    //<  <       <      < 06  76    >         >