繁体   English   中英

这种模式的正则表达式是什么?

[英]What would be the regex for this pattern?

在某些情况下,我的Java程序会收到一个包含几个键值属性的字符串,例如以下示例:

param1=value Param2=values can have spaces PARAM3=values cant have equal characters

参数的名称/键由一个单词(az,AZ,_和0-9)组成,后跟=字符(不由空格分隔)及其值。 该值是一个文本,可以包含空格,并且持续到字符串的结尾或另一个参数的开头。 (这是一个单词,后跟等于及其值,等等)

我需要从此字符串中提取一个Properties对象(字符串到字符串映射)。 我试图使用正则表达式来查找每个键值集。 代码是这样的:

public static String createProperties(String str) {
    Properties prop = new Properties();
    Matcher matcher = Pattern.compile(some regex).match(str);

    while (matcher.find()) {
        String match = matcher.group();
        String param = ...; // What comes before '='
        String value = ...; // What comes after '='
        prop.setProperty(param, value);
    }

    return prop;
}

但是正则表达式写的不能正常工作。

String regex = "(\\w+=.*)+";

由于.*告诉正则表达式获取找到的“任何内容”,因此它将匹配整个字符串。 我想告诉正则表达式进行搜索,直到找到另一个\\\\w=.*为止。 (单词后跟等号,后跟)

我该怎么写这个正则表达式? 或使用正则表达式解决该问题的另一种解决方案是什么?

您可以在此处使用否定前瞻

(\\w+)=((?:(?!\\s*\\w+=).)*)

密钥位于捕获组#1 ,值位于捕获组#2 请注意,我在环顾四周使用了\\s ,以防止该值具有尾随空格。

现场演示

几种中的一种:

List<String> paramNames = new ArrayList<String>();
List<String> paramValues = new ArrayList<String>();
Pattern regex = Pattern.compile("([^\\s=]+)=([^\\s=]+)");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
        paramNames.add(regexMatcher.group(1));
        paramValues.add(regexMatcher.group(2));
    } 

正则表达式:

([^\\s=]+)=([^\\s=]+)

该代码将键检索为组1,将值检索为组2。

说明

  • ([^\\\\s=]+)捕获不是空格或等于Group 1的所有字符
  • =匹配文字=
  • ([^\\\\s=]+)捕获不是空格或等于Group 2的所有字符

您的正则表达式将是

(\\w+=(?:(?!\\w+=).)*)

DEMO

它捕获到下一个param=param=value对。 它将三个param=value对捕获为三个独立的组。

说明:

  • \\\\w+=匹配一个或多个单词字符,后跟=符号。
  • (?:(?!\\\\w+=).)*使用非捕获组和负数超前字符来匹配任何非\\w+=格式的字符。 因此它捕获了下一个param=

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM