有没有办法使用带有两对不同分隔符的正则表达式?

时间:2016-04-25 10:08:14

标签: java regex delimiter regex-lookarounds regex-alternation

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

某些表情符号代码例如是sadhappysmile

到目前为止,它是这样的:

  • 分隔符:()

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

  • 匹配的表情符号代码示例:(sad)(happy)(smile)

我注意到,对于我添加的一些新的表情符号,用户使用另一对分隔符(如字母z和{{1})键入代码会更实用}。然后,第二种情况是这样的:

  • 分隔符:,z

  • 正则表达式:,

  • 匹配的表情符号代码示例:z([.[^z\\,]]+)\\,zsad,zhappy,

我想要的是合并这两个正则表达式,因此用户可以使用两个分隔符中的任意一个来键入表情符号代码,无论他们喜欢哪个,它都会匹配即可。例如, sad 表情符号将被匹配,每当它被写为zsmile,(sad)时,它将显示为图像,如:

  

您好。 (伤心)我有坏消息。的 zsad,

     

嘿...... (悲伤)

     

好。再见。的 zsad,

我尝试过使用交替操作符和外观但没有成功。在以下两个正则表达式中,我只匹配zsad,交流发电机的剩余部分(当然,我想要左右两侧的匹配):

|

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

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

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

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

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

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

对于巨大的文字感到抱歉,我只想提供尽可能详细的信息。有谁知道我在做什么或写错了什么,我可以使用的正则表达式如此匹配 (?=.*\\(([.[^\\(\\)]]+)\\))(?=.*z([.[^z\\,]]+)\\,) zemojicode, 非常感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

我可能会选择

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

我觉得更简单,并且,作为您自己的尝试,只需捕获实际的令牌。 \w允许在令牌中使用数字和下划线,如果您考虑加号,我不知道,但这应该是一个缺点(?)。

所以作为一个java字符串:

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

Check it out here, at regex101

作为替代方案,我想提一下这个:

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

它更简单,但没有内置的语法检查。换句话说,它将允许分隔符的组合,例如, (sad,zhappy),这可能被视为一个缺点。

此致

答案 1 :(得分:0)

您可以使用以下内容:

(z[a-zA-Z]*,|\([a-zA-Z]*\))

这里是example

它会捕获z<anylettershere>,(<anylettershere>)

要在消息中匹配多个1,请使用可能需要的global,并将其包含在示例链接中。它与我提供的3个独立的Java正则表达式测试器上提供的句子相匹配。

修改

只需注意,任何\字符都可能需要加倍。我主要使用的是PHP,而不是Java,所以我对此并不了解,但是给出的例子会变成:

(z[a-zA-Z]*,|\\([a-zA-Z]*\\))

答案 2 :(得分:0)

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

所以,请使用此正则表达式:

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

不要忘记在Java代码中加倍反斜杠。

选中仅处理匹配值的this demo

String s = "Hi. (sad) I've got bad news. zsad,\nHey... (sad)\nOkay. Bye. zsad,";
System.out.println(s.replaceAll("\\(([.[^()]]+)\\)|z([.[^z,]]+),", "<<$0>>")); 

输出:

Hi. <<(sad)>> I've got bad news. <<zsad,>>
Hey... <<(sad)>>
Okay. Bye. <<zsad,>>