【问题标题】:Regex to split when uppercase after alphabetic lowercase char正则表达式在字母小写字符后大写时拆分
【发布时间】:2017-11-09 17:27:28
【问题描述】:

所以我正在尝试使用正则表达式和 java 中的 split 函数来拆分字符串。 当像这样的非大写字母后有大写字母时,正则表达式应该拆分字符串

hHere      // -> should split to ["h", "Here"]

我正在尝试像这样拆分字符串

String str = "1. Test split hHere and not .Here and /Here";
String[] splitString = str.split("(?=\\w+)((?=[^\\s])(?=\\p{Upper}))");
/* print splitString */
// -> should split to ["1. Test split h", "Here and not .Here and not /Here"]
for(String s : splitString) {  
    System.out.println(s);
}

我得到的输出

1. 
Test split h
Here and not .
Here and /
Here

我想要的输出

1. Test split h
Here and not .Here and not /Here

只是无法弄清楚执行此操作的正则表达式

【问题讨论】:

标签: java regex string


【解决方案1】:

您可以使用更简单的模式:(?<=\p{Ll})(?=\p{Lu})

  • (?<= ) 确保给定的模式将匹配,在表达式中的当前位置结束。
  • (?= ) 断言可以在此处匹配给定的子模式,而无需消耗字符

  • 两者都不消耗任何字符,非常重要!


str.split("(?<=[a-z])(?=[A-Z])");旧版本不支持其他字母

【讨论】:

  • 你能解释一下你的正则表达式吗?
  • Thx 看起来成功了。但是瑞典字母 åäö 呢?那些不会包括在内吧?
  • @HowTheF 在comment by ctwheels 中查看第二个正则表达式:(?<=\p{Ll})(?=\p{Lu})
  • @HowTheF 如果您要解析瑞典语,请使用 ctwheels 在评论中提供的第二个选项。不要忘记将反斜杠加倍。
  • @Andreas 我要去上打字课,这样我才能跟上你的步伐。
【解决方案2】:

根据我原来的评论。

代码

选项 1

此选项适用于 ASCII 字符(不适用于 Unicode 字符)。基本上,这适用于英文文本。

See regex in use here

(?<=[a-z])(?=[A-Z])

选项 2

此选项适用于 Unicode 字符。这适用于任何语言。

See regex in use here

(?<=\p{Ll})(?=\p{Lu})

说明

选项 1

  • (?&lt;=[a-z]) 正向后视确保前面是集合中的字符 a-z(小写 ASCII 字符)
  • (?=[A-Z]) 正向前瞻确保后面是集合中的字符 A-Z(大写 ASCII 字符)

选项 2

  • (?&lt;=\p{Ll}) 正向后视确保前面是集合中的字符 \p{Ll}(小写字母 Unicode 属性/脚本类别)
  • (?=\p{Lu}) 正向前瞻确保后面是集合 \p{Lu} 中的一个字符(大写字母 Unicode 属性/脚本类别)

【讨论】: