加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 正则表达式和转义和未转义的分隔符

发布时间:2020-12-15 00:49:37 所属栏目:Java 来源:网络整理
导读:与 this有关的问题 我有一个字符串 a;b;c;d 在Java中看起来像 String s = "a;b\;c;d" 我需要用分号按照以下规则拆分它: 如果分号前面有反斜杠,则不应将其视为分隔符(在a和b之间). 如果反斜杠本身被转义,因此不会以分号方式转义,那分号应该是分隔符(
与 this有关的问题

我有一个字符串

a;b;c;d

在Java中看起来像

String s = "a;b\;c;d"

我需要用分号按照以下规则拆分它:

>如果分号前面有反斜杠,则不应将其视为分隔符(在a和b之间).
>如果反斜杠本身被转义,因此不会以分号方式转义,那分号应该是分隔符(在b和c之间).

因此,如果在它之前存在零或偶数个反斜杠,则应将分号视为分隔符.

例如上面,我想得到以下字符串(java编译器的双反斜杠):

a;b
c
d

解决方法

你可以使用正则表达式
(?:.|[^;]++)*

匹配未转义分号之间的所有文本:

List<String> matchList = new ArrayList<String>();
try {
    Pattern regex = Pattern.compile("(?:\.|[^;\]++)*");
    Matcher regexMatcher = regex.matcher(subjectString);
    while (regexMatcher.find()) {
        matchList.add(regexMatcher.group());
    }

说明:

(?:        # Match either...
 .       # any escaped character
|          # or...
 [^;]++  # any character(s) except semicolon or backslash; possessive match
)*         # Repeat any number of times.

由于嵌套量词,占有性匹配()对于避免灾难性回溯非常重要.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读