繁体   English   中英

使用正则表达式在字符串中查找某些冒号

[英]Find certain colons in string using Regex

我正在尝试在给定字符串中搜索冒号,以便根据以下条件在冒号处拆分字符串以进行预处理

  1. 前面或后面跟一个词,例如A Book: Chapter 1A Book:Chapter 1
  2. 如果它是表情符号的一部分,则不匹配,即:( or ): or:/ or:-)
  3. 如果它是给定时间的一部分,即16:00等,则不匹配

我想出了一个正则表达式

(\:)(?=\w)|(?<=\w)(\:)

它满足条件 2 和 3,但在条件 3 上仍然失败,因为它与时间字符串表示中的冒号相匹配。 我该如何解决?

编辑:如果可能的话,它必须在一个正则表达式语句中

单词字符\w包括数字[a-zA-Z0-9_]所以只用[a-ZA-Z]代替

(\:)(?=[a-zA-Z])|(?<=[a-zA-Z])(\:)

在这里测试

您可以使用

(:\b|\b:)(?!(?:(?<=\b\d:)|(?<=\b\d{2}:))\d{1,2}\b)

请参阅正则表达式演示 详情

  • (:\b|\b:) - 第 1 组:a :前面或后面有一个单词 char
  • (??(:?(:<=\b\d?)|(:<=\b\d{2},))\d{1,2}\b) - 不应有一位或两位数字紧跟在:之后(后跟单词边界)如果:前面有一个或两个数字(前面有单词边界)。

注意:\b等于:(?=\w)并且\b:等于(?<=\w):

如果您需要获得与原始模式相同的捕获组,请将(:\b|\b:)替换为(?:(:)\b|\b(:))

更灵活的解决方案

请注意,可以使用更简单的模式来排除匹配项,该模式匹配并捕获您需要的内容,只匹配您不需要的内容。 这被称为“有史以来最好的正则表达式技巧” 所以,你可以使用像这样的正则表达式

8:|:[PD]|\d+(?::\d+)+|(:\b|\b:)

将匹配8::P:D 、一个或多个数字,然后是一个或多个:序列和一个或多个数字,或者将匹配并捕获到第 1 组 a :前面或后面有单词的字符字符。 您需要做的就是检查第 1 组是否匹配,并在代码中实现所需的提取/替换逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM