Java 有没有办法将正则表达式与两对不同的分隔符一起使用?
我已经将emojis添加到我的Android应用程序中,并且在Java中使用Regex,因此分配给它们的代码将匹配正则表达式(其中包含一对要使用的分隔符),使字符显示为图像 一些表情符号代码是,例如,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]*\)) 分隔符:(和) 正则表达式:\\([..[^\\(\\)]+)\\) 匹配的表情符号代码示例:(悲伤),(快乐),(微笑) 不过,我注意到,对于我添加的一些新表情符号,用户
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)
或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个捕获的组(整个匹配就是令牌):(?