我正在尝试重新创建不和谐的表情符号解析消息的方式。
例如,我希望将消息["Hello, ", ":smile:", ":hearth:", " world!"]
拆分为以下数组:
Arrays.toString(message.split("(:[A-Za-z]+:)"))
我已经尝试使用以下代码拆分数组:
["Hello", , , " world!"]
但是,split方法会删除找到的定界符。所以最终结果看起来像这样:
by_selection_id = operator.itemgetter('selection_id')
market.sort(key=by_selection_id)
答案 0 :(得分:7)
从您的输入字符串和预期结果来看,我可以推断出您基本上想从三个规则中分割字符串。
因此,您可以对上述所有三种情况使用交替形式使用此正则表达式。
(?<=:)(?=:)|(?<= )(?=:)|(?<=:)(?= )
Java代码
String s = "Hello, :smile::hearth: world!";
System.out.println(Arrays.toString(s.split("(?<=:)(?=:)|(?<= )(?=:)|(?<=:)(?= )")));
打印出预期的效果,
[Hello, , :smile:, :hearth:, world!]
另外,如果您可以使用匹配文本而不是拆分的方法,则正则表达式将更易于使用,而正是这样,
:[^:]+:|\S+
Java代码
String s = "Hello, :smile::hearth: world!";
Pattern p = Pattern.compile(":[^:]+:|\\S+");
Matcher m = p.matcher(s);
while(m.find()) {
System.out.println(m.group());
}
打印
Hello,
:smile:
:hearth:
world!
答案 1 :(得分:1)
请使用正则表达式的Lookahead,向后看以获得预期的结果。请参考下面的代码片段
public static void main(String[] args) {
String message= "Hello, :smile::hearth: world!";
System.out.println(Arrays.toString(message.split("(?=,)|(?=(?!)::)|(?<=(:[A-Za-z]+:))")));
}
哪个将输出为 [你好,:: mile :,:hearth :,世界!]