正则表达式选择字符出现在奇数出现的字符串

时间:2017-12-04 13:37:19

标签: java regex string

我正在尝试创建一个正则表达式,它将选择引用字符出现在奇数出现的单词。我被卡住了......

假设我有这4个字符串:

  • 你好'
  • pl'pl'op
  • 'HEGER
  • qwe'rty

我应该得到这个清单:

  • 你好'
  • 'HEGER
  • qwe'rty

我在圈子里跑来跑去,我甚至不知道是否有可能在正则表达式中这样做。我在正则表达式方面不太好。

我应该只循环所有字符串的每个字符,计算引号数量并进行模运算以检查数字是否为奇数?

3 个答案:

答案 0 :(得分:3)

代码

See regex in use here

^(?!(?:\w*'\w*'\w*)+$)[\w']+$

根据我的问题下面的评论,可以通过将非捕获组更改为原子组来进行改进,如以下模式所示。这项优化归功于@Thefourthbird

^(?!(?>\w*'\w*'\w*)+$)[\w']+$

结果

输入

hello'
pl'pl'op
'heger
qwe'rty

q'
q'q'
q'q'q'
q'q'q'q'
q'q'q'q'q'
q'q'q'q'q'q'
q'q'q'q'q'q'q'
q'q'q'q'q'q'q'q'
q'q'q'q'q'q'q'q'q'

输出

以下只显示匹配

hello'
'heger
qwe'rty

q'
q'q'q'
q'q'q'q'q'
q'q'q'q'q'q'q'
q'q'q'q'q'q'q'q'q'

说明

  • ^在行首处断言位置
  • (?!(?:\w*'\w*'\w*)+$)否定前瞻确保后续内容不匹配
    • (?:\w*'\w*'\w*)+匹配撇号和单词字符的任意组合,其中撇号字符恰好出现两次,一次或多次(这意味着2,4,6,8,10,...次)
    • $断言行尾的位置
  • [\w']+匹配一个或多个单词字符或撇号'
  • $断言行尾的位置

答案 1 :(得分:0)

你不需要正则表达式。只需检查countMatches是否返回奇数

public class Main {

    public static void main(String[] args) {
        String check = "pl'pl'op";

        System.out.println("Ocurrences: " + StringUtils.countMatches(check, "'"));

    }
}

输出:Ocurrences: 2

答案 2 :(得分:0)

试试这个:

([^']*'[^']*'[^'])*[^']*'[^']*

这个想法是在组中捕获偶数(可能是0)引号,以及它们之间的文本,然后再引用一个引号。