我的问题是 this 的 Scala (Java) 变体Python 上的查询。
特别是,我有一个字符串 val myStr = "Shall we meet at, let's say, 8:45 AM?"
。我想将其标记化并保留分隔符(除空格之外的所有分隔符)。如果我的分隔符只是字符,例如.
, :
, ?
等等,我可以这样做:
val strArr = myStr.split("((\\s+)|(?=[,.;:?])|(?<=\\b[,.;:?]))")
产生
[Shall, we, meet, at, ,, let's, say, ,, 8, :, 45, AM, ?]
但是,我想制作拍号\\d+:\\d+
分隔符,并且仍然想保留它。所以,我想要的是
[Shall, we, meet, at, ,, let's, say, ,, 8:45, AM, ?]
注意:
- 添加析取
(?=(\\d+:\\d+))
split 语句的表达式没有帮助 - 拍号之外,
:
本身就是一个分隔符
我怎样才能做到这一点?
最佳答案
我建议匹配所有标记,而不是拆分字符串,因为这样您可以更好地控制所获得的内容:
\b\d{1,2}:\d{2}\b|[,.;:?]+|(?:(?!\b\d{1,2}:\d{2}\b)[^\s,.;:?])+
请参阅regex demo .
我们开始匹配最具体的模式,最后一个是最通用的模式。
详细信息
\b\d{1,2}:\d{2}\b
- 1 到 2 位数字,:
,2 位数字包含在字边界内<|
- 或[,.;:?]+
- 1 个或多个,
,.
,;
,:
,?
字符|
- 或(?:(?!\b\d{1,2}:\d{2}\b)[^\s,.;:?])+
- 匹配任何字符这不是我们的分隔符字符或空格 ([^\s,.;:?]
),也不是时间字符串的起点。
考虑this snippet :
val str = "Shall we meet at, let's say, 8:45 AM?"
var rx = """\b\d{1,2}:\d{2}\b|[,.;:?]+|(?:(?!\b\d{1,2}:\d{2}\b)[^\s,.;:?])+""".r
rx findAllIn str foreach println
输出:
Shall
we
meet
at
,
let's
say
,
8:45
AM
?
关于Java字符串标记化: Split on pattern and retain pattern,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45934780/