gpt4 book ai didi

java - 识别组的正则表达式

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:36:11 26 4
gpt4 key购买 nike

我有以下字符串

@name Home @options {} @include h1,h2,h3 @exclude p,div,em

我想按正则表达式拆分并将其存储在 HashMap

@name->Home
@options->{}
@include->h1,h2,h3
@exclude->p,div,em

我使用了下面的正则表达式,但它匹配@name 之后的整个字符串

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class NewClass {

public static void main(String[] args) {
String regex = "((?<var>@(\\S)+) (?<val>.+) *)+";

String val = "@name Home @options {} @include h1,h2,h3 @exclude p,div,em";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(val);
if (matcher.matches()) {
System.out.println(matcher.group("var"));
System.out.println(matcher.group("val"));
}
}
}

输出为

@name
Home @options {} @include h1,h2,h3 @exclude p,div,em

最佳答案

您的正则表达式的问题是您不知道输入中的组数,即有多少 @xxx有团体。因此,您需要多次应用正则表达式,即使用 while 循环和 matcher.find() :

while (matcher.find()) {
System.out.println(matcher.group("var"));
System.out.println(matcher.group("val"));
}

那就是说您的正则表达式只需要匹配一个组,并且假设您之间没有其他任何东西,您基本上从第一个 @ 开始匹配到输入的下一个或末尾。因此你的表达可能会变成 (?<var>@(\S)+) (?<val>[^@]+) .

该表达式基本上由 2 个部分组成,中间有一个空格(您可能希望将其更改为 \s+:

  • (?<var>@(\S)+)匹配以 @ 开头的组名并以非空格的任何内容继续。请注意,这里不需要内部组,因此只需使用 \S+ - 除非你想在没有 @ 的情况下提取名称.
  • (?<val>[^@]+)匹配至少一个不是 @ 的字符的任何序列,即下一个@或输入结束。请注意,您不会以这种方式匹配空组,因此如果您也想匹配这些空组,您可能需要将量词更改为 *相反。

关于java - 识别组的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41977155/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com