正则表达式:用文本中的冒号替换句点

时间:2017-10-26 10:48:56

标签: c# regex

我需要用冒号替换带小数点的数字。简而言之:

输入

  

在5.50接我,带我去动物园

必需

  

在5:50接我,带我去动物园


但是,我不想只用一段时间来替换一个数字:

输入

  

5点接我。带我去动物园。

必需

  

5点接我。带我去动物园。

我可以通过蛮力来做到这一点,但我相信正则表达式是最好的解决方案,并且不可避免地因为我不是正则表达式专家,所以我遇到了Zawinski法则。

我可以匹配这个号码,但我仍然坚持如何进行更换。

\d\.\d+

enter image description here

我认为我需要使用前瞻和/或分组,但我不熟悉语法。

我之前发现过Replace dot(.) with comma(,) using RegEx?Remove decimal point when not between two digits之类的问题,但是第一个问题根本没有使用正则表达式,而第二个看起来很相似,但我无法弄清楚如何改变答案以获得匹配,更不用说如何替换它。

2 个答案:

答案 0 :(得分:4)

要继续使用当前的解决方案,您需要确保更换后点的两端数字可以保持不变,但在匹配时仍需要计算(检查)。

有两种方法可以实现这一目标:

  • 在替换
  • 中使用捕获组+反向引用
  • 使用lookarounds

这是捕获组的第一种方法:

Regex.Replace(s, @"(\d)\.(\d+)", "$1:$2")

另一个有外观:

Regex.Replace(s, @"(?<=\d)\.(?=\d)", ":")

请参阅regex demo 1regex demo 2

<强>详情

  • (\d) - 第1组(后来在$1替换反向引用的帮助下引用):任何一个Unicode数字或
  • (?<=\d) - 一个正面的背后隐藏,需要紧靠当前位置左侧的数字
  • \. - 一个点
  • (\d+) - 第2组(后来在$2替换反向引用的帮助下引用):任何1个或多个Unicode数字或
  • (?=\d) - 一个积极的前瞻,需要在当前位置右侧有一个数字

您可以继续调整它以仅匹配单词边界内的字符串,并在第二个\d上使用限制量词来匹配仅2位数字:

\b(\d)\.(\d{2})\b

(?<=\b\d)\.(?=\d{2}\b)

请参阅another regex demo(和Version 2 regex with lookarounds)。请注意,有时需要进一步调整字边界。

要确保只匹配ASCII数字,请使用RegexOptions.ECMAScript选项。或者将所有\d替换为[0-9]

答案 1 :(得分:1)

对于24小时格式,您可以使用此正则表达式:

/([0-1]?[0-9]|[2][0-3]).[0-5]?[0-9]/

基本上匹配:

时间:

  • 5,05等(意思是凌晨5点)
  • 12,15等(对于PM)
  • 20,21,22,23但不是24或50(对于PM)

分:

  • 5分钟,没有前导零
  • 05为领先的零
  • 所有两位数字,可以是一小时内的分钟数(00-59)
  • 但不是非分钟数分钟,如60,89等。

确保仅在输入有效时间时才执行此操作。它是你最接近的。匹配整个正则表达式,将.替换为:并将其放回原位。