Java字符串标记化: Split on pattern and retain pattern

标签 java regex string scala tokenize

我的问题是 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, ?]

注意:

  1. 添加析取 (?=(\\d+:\\d+)) split 语句的表达式没有帮助
  2. 拍号之外,:本身就是一个分隔符

我怎样才能做到这一点?

最佳答案

我建议匹配所有标记,而不是拆分字符串,因为这样您可以更好地控制所获得的内容:

 \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/

相关文章:

regex - 什么(?: do in a regular expression

python - 查找字符串中第一个数字的索引

regex - 如何使用 s///运算符将字符插入到字符串中?

c++ - 如何使用 wstring 上的任何流来提取数据

java - 在我的 java 函数中实现搜索

java - 在我的应用程序中运行 tesseract OCR 引擎时发生错误

xml - XSLT 2.0 - 正则表达式无限

java - 如何查看分层 Pane 内的组件

java - Ivy - 将解析结果输出到 ivy 文件

java - Java/POSIX 正则表达式中是否有 `{\pGraph}` 的 Unicode 等效项?