首页 > 解决方案 > Java/Regex:否定重复两次的相同字符:

问题描述

如果我有以下字符串:

--l=Richmond-Hill, NYC --m=5-day --d=hourly

我想匹配组:

--l=Richmond-Hill, NYC

--m=5-day

--d=hourly

我想出了以下正则表达式:

(^--[a-zA-Z]=[^-]*)

当等号后的值没有破折号时,此方法有效。基本上,我如何否定双破折号?

标签: javaregex

解决方案


我的猜测是,也许您希望设计一些类似于:

--[a-zA-Z]=.*?(?=--|$)

演示

测试

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


public class re{
    public static void main(String[] args){

        final String regex = "--[a-zA-Z]=.*?(?=--|$)";
        final String string = "--l=Richmond-Hill, NYC --m=5-day --d=hourly\n"
             + "--l=Richmond-Hill, NYC\n"
             + "--m=5-day\n"
             + "--d=hourly";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("Group " + i + ": " + matcher.group(i));
            }
        }

    }
}

输出

Full match: --l=Richmond-Hill, NYC 
Full match: --m=5-day 
Full match: --d=hourly
Full match: --l=Richmond-Hill, NYC
Full match: --m=5-day
Full match: --d=hourly

如果您想探索/简化/修改表达式,它已在 regex101.com的右上角面板中进行了说明。如果您愿意,您还可以在此链接中观看它如何与一些示例输入匹配。


正则表达式电路

jex.im可视化正则表达式:

在此处输入图像描述


推荐阅读