正则表达式在大写字母小写字母后分割

时间:2017-11-09 17:27:28

标签: java regex string

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

$result  = $conn->query("SELECT performer,file_id,title,duration FROM 
    databasebot WHERE performer = '$message' or title = '$message'");

$poets = array(
    "keyboard" => array()
);


while ($row = mysqli_fetch_row($result)) {        
    $poets['keyboard'][] = array($row[2],$row[1]);         
}

我试图像这样分割一个字符串

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

只是无法弄清楚这样做的正则表达式

2 个答案:

答案 0 :(得分:2)

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

  • (?<= )确保给定的模式匹配,从表达式中的当前位置结束。
  • (?= )声明可以在此处匹配给定的子模式,而不会消耗字符

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

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

答案 1 :(得分:1)

根据我原来的评论。

代码

选项1

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

See regex in use here

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

选项2

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

See regex in use here

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

说明

选项1

  • (?<=[a-z])确定前面的内容是a-z(小写ASCII字符)
  • 中的字符。
  • (?=[A-Z])确定以下内容的正向前瞻是集A-Z中的字符(大写ASCII字符)

选项2

  • (?<=\p{Ll})肯定的后视是确保集合\p{Ll}(小写字母Unicode属性/脚本类别)中的字符前面的内容
  • (?=\p{Lu})确定以下内容的正面预测是集\p{Lu}中的字符(大写字母Unicode属性/脚本类别)