笑脸的正则表达式模式无法区分减号和范围

我正在做这个正则表达式

[:|;]{1}([\\(|\\)|D|p]|[-\\(]|[-\\)]){1}

对于这个候选人

:) :) x-] :ox ;-( ;-) ;~( :~D ;)

这里 https://regex101.com/r/3swEO2/3/

预期结果是 :) :) ;-( ;-) 的匹配

但是我无法创建带有减号的模式,当不在匹配器组的开头时,这些减号被识别为范围。

对正确组的提示将不胜感激!


ABOUTYOU
浏览 108回答 2
2回答

温温酱

为什么要在同一组中尝试匹配它?只需添加另一部分以与 {0, 1} 量词匹配。[:|;]{1}\-{0,1}([\(|\)|D|p]){1}由于您在 Java 中使用它,您可能需要加倍反斜杠以便首先正确转义 String。在这种情况下,您可以这样做::\)|[:|;]{1}\-{1}([\(|\)|D|p]){1}或者由于案例似乎没有很多可能的匹配项,只需像这样枚举它们::\)|;-\(|;-\)我测试了它,它工作得很好:import java.util.regex.Matcher;import java.util.regex.Pattern;public class test {    public static void main(String[] args) {        String s = ":) :) x-] :ox ;-( ;-) ;~( :~D ;)";        Pattern patt = Pattern.compile(":\\)|;-\\(|;-\\)");        Matcher m = patt.matcher(s);        while (m.find())            System.out.print(m.group() + " ");    }}打印所有 4 场比赛::) :) ;-( ;-)

FFIVE

这应该做:(:-?[\|DdPpXx\[\])(]|;-[\|DdPpXx\[\])(])[\|DdPpXx\[\])(]是可用于覆盖所有可能字符的字符集。除此之外,我正在使用 OR 管道|来涵盖这两种情况 wrt:和;。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java