匹配1或更小的量词

时间:2014-07-15 18:06:59

标签: regex tcl hl7

我有一行文字,其中包含几个波形符(〜)。在这种情况下,我正在使用一串数据作为报告。每个代字号表示换行符/回车符。我需要做的是只匹配单个波浪号(这样我就可以将它们变成空格)。我想按原样保留多个波浪组。我能够匹配多个波浪的组(使用~{2,})但是,我基本上需要匹配相反的波段。

以下是我要修改的文字示例:

  

结果:~~ VASCULAR:IVC ~~~~~~~~~~~~~~~~,门静脉出现   正常。主动脉在〜口径下是正常的,没有〜动脉瘤

在这个例子中,我想匹配不属于其他波浪组的所有3个波浪号。现实世界"数据将包含许多波形符 - 有些可能在字符串的开头和/或结尾。它们可能被空格或字符包围。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

set new [regsub -all {(^|[^~])~([^~]|$)} $str {\1 \2}]

现在我有时间,有些话。

我们正在寻找一个没有波浪号的波浪号,后面没有波浪号。我们可以尝试这样做:{[^~]~[^~]}就是这样做的。但是,该表达式要求前后实际存在一个字符:如果我们要查找的单个代字号出现在行的开头或结尾怎么办?所以,我们想要:

  • 字符串的开头或非字符字符(^|[^~]),后跟
  • 一个代字号,然后是
  • 非波形字符或字符串([^~]|$)的结尾。

我们需要使用捕获括号来记住在我们变成空格的波浪号之前和之后发生的字符,因此替换字符串是{\1 \2} ==由第一组括号捕获的字符,然后是一个空格,然后是第二组括号捕获的字符。

我们Tcl用户很幸运拥有我们拥有的正则表达式引擎。它性能非常高,功能非常丰富。

答案 1 :(得分:0)

编辑:没有意识到TCL不允许外观。格伦的答案似乎已经涵盖了它。

你可以试试这个。只需使用负向lookbehind和lookahead来确保代字号不在其他代字号之前或之后。

(?<!~)~(?!~)

测试here