所以我试图用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
只是无法弄清楚这样做的正则表达式
答案 0 :(得分:2)
您可以使用更简单的模式:(?<=\p{Ll})(?=\p{Lu})
(?<= )
确保给定的模式匹配,从表达式中的当前位置结束。 (?= )
声明可以在此处匹配给定的子模式,而不会消耗字符
两者都不消耗任何字符,非常重要!
str.split("(?<=[a-z])(?=[A-Z])");
旧版本不适用于其他字母
答案 1 :(得分:1)
根据我原来的评论。
此选项适用于ASCII字符(它不适用于Unicode字符)。基本上,这适用于英文文本。
(?<=[a-z])(?=[A-Z])
此选项适用于Unicode字符。这适用于任何语言。
(?<=\p{Ll})(?=\p{Lu})
(?<=[a-z])
确定前面的内容是a-z
(小写ASCII字符)(?=[A-Z])
确定以下内容的正向前瞻是集A-Z
中的字符(大写ASCII字符)(?<=\p{Ll})
肯定的后视是确保集合\p{Ll}
(小写字母Unicode属性/脚本类别)中的字符前面的内容(?=\p{Lu})
确定以下内容的正面预测是集\p{Lu}
中的字符(大写字母Unicode属性/脚本类别)