Java 有没有办法将正则表达式与两对不同的分隔符一起使用?

Java 有没有办法将正则表达式与两对不同的分隔符一起使用?,java,regex,delimiter,regex-lookarounds,regex-alternation,Java,Regex,Delimiter,Regex Lookarounds,Regex Alternation,我已经将emojis添加到我的Android应用程序中,并且在Java中使用Regex,因此分配给它们的代码将匹配正则表达式(其中包含一对要使用的分隔符),使字符显示为图像 一些表情符号代码是,例如,sad,happy,smile 到目前为止,情况是这样的: (z[a-zA-Z]*,|\([a-zA-Z]*\)) 分隔符:(和) 正则表达式:\\([..[^\\(\\)]+)\\) 匹配的表情符号代码示例:(悲伤),(快乐),(微笑) 不过,我注意到,对于我添加的一些新表情符号,用户

我已经将emojis添加到我的Android应用程序中,并且在Java中使用Regex,因此分配给它们的代码将匹配正则表达式(其中包含一对要使用的分隔符),使字符显示为图像

一些表情符号代码是,例如,
sad
happy
smile

到目前为止,情况是这样的:

(z[a-zA-Z]*,|\([a-zA-Z]*\))
  • 分隔符:

  • 正则表达式:
    \\([..[^\\(\\)]+)\\)

  • 匹配的表情符号代码示例:
    (悲伤)
    (快乐)
    (微笑)

不过,我注意到,对于我添加的一些新表情符号,用户使用另一对分隔符(如字母
z
)键入代码更为实用。那么,第二种情况是这样的:

(z[a-zA-Z]*,|\([a-zA-Z]*\))
  • 分隔符:
    z

  • 正则表达式:
    z([.[^z\,]]+)\,

  • 匹配的表情符号代码示例:
    zsad,
    zhappy,
    zsmile,

那么,我想要的是合并这两个正则表达式,这样用户就可以使用这两对分隔符中的任意一个来键入表情代码,无论他或她喜欢哪一个,它都将被匹配。例如,sad表情符号将被匹配,每次以
(sad)
zsad、
的形式书写时,它都会显示为图像,如:

(悲伤)我有个坏消息zsad,

(悲伤)

好的。再见zsad,

我尝试过使用交替操作符和lookarounds,但没有成功。在以下两个正则表达式中,我只对
|
交流发电机的左侧进行了匹配(当然,我希望左侧和右侧都进行匹配):

\\([.[.\\\(\\)]+)\\\| z([.[.^z\,]]+)\\,

z([.[^z\,]]+)\,[124;\([.[.^\\(\\)]]+)\)

在以下正则表达式中,我根本没有匹配项:

(\\([.\\\(\\\)]+)\\| z([.[.^z\,]]+)\,)
(\\([.\\\\(\\\)]+)\;(z([.[^z\,]+)\,)

(z([.[.^z\,]+)\,[124;\([..[.^\(\\)]+)\)
(z([.[.^z\,]+)\,)(\([.[^\\(\\)]+)\)

\\([.\\\(\\z\\)]+)\\\,
(\\(\\\)([.\\\(\\z\\))]+(\\\\)(\\\)(z)([.\\\\\(\\z\\,)]+(\\)(\\)(\\)(\\)(\\)(\\)(\\)(\\,)

(?=\\([.[.^\(\\)]+)\)(?=z([..[.^z\\,]+)\,)
(?=.\\\([..[.^\\(\\)]+)\)(?=.*z([.[^z\\,]+)\,)


对不起,这篇文章太多了,我只想提供尽可能多的细节。有人知道我做错了什么或写错了什么,知道我可以使用什么正则表达式来匹配
zemojicode、
(emojicode)
非常感谢您的帮助。

您可以使用这样的方法:

(z[a-zA-Z]*,|\([a-zA-Z]*\))
这是我的建议

它将捕获
z、
()

要匹配一条消息中的多条消息,请使用global,这可能是必需的,它包含在示例链接中。它与您在我找到的3个单独的Java正则表达式测试仪上提供的句子相匹配

编辑

请注意,任何
\
字符都可能需要加倍。我主要使用PHP,而不是Java,因此我对此不太了解,但给出的示例将变成:

(z[a-zA-Z]*,|\\([a-zA-Z]*\\))
我可能会和你一起去

\((\w+)\)|z(\w+),
我发现这更简单,而且,作为您自己的尝试,只需捕获实际的令牌。<代码> \W/COD>允许令牌中的数字和下划线,我不知道如果您考虑一个加号,但不应该是一个缺点(?) 因此,作为java字符串:

 \\((\\w+)\\)|z(\\w+),

另一种选择是,我想提到这一点:

[(z](\w+)[),]
它甚至更简单,但没有内置的语法检查。换句话说,它将允许分隔符的组合,例如,
(sad,
zhappy)
,这可能被认为是一个缺点


关于

Java不允许对捕获组使用重复的名称,也不支持分支重置,也不支持条件表达式。您需要使用交替,然后根据处理匹配的方式采取行动

因此,使用这个正则表达式:

\(([.[^()]]+)\)|z([.[^z,]]+),
不要忘记在Java代码中加倍反斜杠

检查是否仅处理匹配值:

String s=“嗨。(悲伤)我有个坏消息。zsad,\nHey…(悲伤)\nOkay.Bye.zsad,”;
System.out.println(s.replaceAll(“\\([.[^()]]+)\)| z([.[^z,]]+),“,”);
输出:

Hi. <<(sad)>> I've got bad news. <<zsad,>>
Hey... <<(sad)>>
Okay. Bye. <<zsad,>>
你好。我有个坏消息。 嘿 可以再见。
Java不允许对捕获组使用重复的名称,也不支持分支重置,也不支持条件表达式。您需要使用交替,然后根据需要处理匹配的方式采取行动:
\([.[.^()]]+)\z([.[.^z,]]+),
(当然,在Java中,可以同时使用这个反斜杠)。顺便问一下,为什么你的模式中有一个点?我把我的评论转换成了一个答案。我喜欢你最初的正则表达式。如果只想匹配令牌,可以使用look arounds,这将避免处理2个捕获的组(整个匹配就是令牌):
(?