使用JAVA的RegEx问题

lh80um4z  于 2023-05-01  发布在  Java
关注(0)|答案(2)|浏览(81)

在网上搜索了一周,尝试了不同的方法后,我放弃了。我在Java中遇到了一个RegEx的问题,我想知道我是否可以在这里找到一些帮助。
我试图在一个巨大的字符串中找到这个"< < < < 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个随机数字+一些空格+两个"〉〉"

  • “〈”和“〉”之间的空格可以在1到4个之间。

段末:两个"〈〈"+一些空格+2个随机数字+一些空格+2个随机数字+一些空格+四个"〉〉〉〉"

  • “〈”和“〉”之间的空格可以在1到4个之间。

下面是一个文本段落的例子:
〈〈〈〈06 76〉〉Lorem ipsum dolor sit amet,consectetur adipiscing elit.Donec sit amet mauris lorem.[咒语]Vivamus venenatis diam is sollicitudin.治疗不需要最终结果。前庭放置原直径我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,活得有功效,或无所见,有所见。他的一切都是空的。整只手,一只手,一只手,一只手,一只手,一只手。伏隔前庭一个柔软的心,一个柔软的心。怀孕前的前庭,可能是子宫。先吃点鲱鱼。〈〈06 76〉〉〉〉
〈〈〈〈12 23〉〉Morbi aliquet condimentum tempus.这是一个湖。[医]前庭白藜芦醇极度痛苦。悬念潜能他是猫。我是大个子,我不是小个子,我是大个子。我们的社会和法律对人类的影响是不言而喻的。悬案。[咒语][咒语]Nullam et odio elit.我不知道你现在是什么样子,你的生活也是一样的。〈〈12 23〉〉〉〉
再一次,很抱歉长的帖子和许多最后一分钟的编辑。

3pvhb19x

3pvhb19x1#

像这样的吗

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    >         >
py49o6xq

py49o6xq2#

你可以用

<(?:\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 demo|Java 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

相关问题