Regex 匹配1或更少的量词

Regex 匹配1或更少的量词,regex,tcl,hl7,Regex,Tcl,Hl7,我有一行文本,其中包含几个平铺字符(~)。在这个场景中,我使用的是一个报告字符串数据。每个波浪线表示换行/回车。我需要做的是只匹配单个瓷砖(这样我就可以把它们变成空格)。我想让多个瓷砖组保持原样。我能够匹配多个tilde的组(使用~{2,}),但是,我基本上需要匹配相反的tilde 以下是我试图修改的文本示例: 发现:~~血管:下腔静脉和门静脉出现 正常。主动脉口径正常,无动脉瘤 在本例中,我希望匹配不在其他瓷砖组中的所有3个瓷砖。“真实世界”数据将始终包含许多波浪形,其中一些波浪形可能位于字符

我有一行文本,其中包含几个平铺字符(~)。在这个场景中,我使用的是一个报告字符串数据。每个波浪线表示换行/回车。我需要做的是只匹配单个瓷砖(这样我就可以把它们变成空格)。我想让多个瓷砖组保持原样。我能够匹配多个tilde的组(使用
~{2,}
),但是,我基本上需要匹配相反的tilde

以下是我试图修改的文本示例:

发现:~~血管:下腔静脉和门静脉出现 正常。主动脉口径正常,无动脉瘤

在本例中,我希望匹配不在其他瓷砖组中的所有3个瓷砖。“真实世界”数据将始终包含许多波浪形,其中一些波浪形可能位于字符串的开头和/或结尾。它们可能被空格或字符包围


提前感谢您的帮助

编辑:没有意识到TCL不允许lookbehind。格伦的回答似乎涵盖了这一点

你可以试试这个。只需使用负的lookbehind和lookbeahead来确保tilde前面或后面没有另一个tilde

(?<!~)~(?!~)
(?
测试


现在我有一些时间,一些话

我们正在寻找前面没有波浪线且后面没有波浪线的波浪线。我们可以尝试以下操作:
{[^~]~[^~]}
正是这样。但是,该表达式要求前后都有一个字符:如果我们要查找的单个波浪线出现在行首或行尾,该怎么办?因此,我们希望:

  • 字符串或非平铺字符
    (^ |[^~])
    的开头,后跟
  • 一块瓷砖,后面是
  • 非平铺字符或字符串的结尾
    ([^~]|$)
我们需要使用捕获括号来记住我们要转换为空格的波浪号前后出现的字符,因此替换字符串是
{\1\2}
==第一组括号捕获的字符,然后是空格,然后是第二组括号捕获的字符


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

没有。Tcl没有lookbehinds(Tcl使用自己的正则表达式实现,而不是PCRE):谢谢@CodyProbst!我感谢您抽出时间回答我的问题!除了讨厌的Tcl业务之外,这是正确的。;-)虽然这可以回答这个问题-你能添加一些解释性的文字来帮助解释你的答案吗?我同意。这是一种很好的形式,可以解释您正在使用这段代码做什么,以及它为什么以及如何解决原始问题。别忘了堆栈溢出中充满了新手,而对你来说显而易见的东西对他们来说却不是。他们可以从你的专业知识中学到一两件事:)不,只是不。stack overflow的新手不知道他们需要阅读regex教程,而在阅读你的答案之前假设他们应该阅读,这对他们来说是不好的,而且会把他们排除在外。你也曾经是个新手。曾经有一段时间,当你看到一个正则表达式时,你不知道它是什么,也不知道你需要阅读什么才能了解它是什么,这里编写的代码是否能解决你的问题。就在今天,我在这个网站上帮助了一个7年级的孩子。这个网站欢迎这样的人。他们只是在学习。他们需要你的帮助和经验,而不是你的易怒。请友善地解释一下你在做什么。还有——我之所以对你的答案发表评论,是因为你的答案出现在“低质量”的评论队列中。。。即使是Stack Overflow的机器人程序也认为您需要对答案进行更多解释,本网站的政策要求您这样做。你还会注意到,我不是唯一一个(甚至不是第一个)向你指出这一点的人。那就请吧it@TarynEast,你鼓励更好的解释是对的。有时候白天我只有时间快速回答。
set new [regsub -all {(^|[^~])~([^~]|$)} $str {\1 \2}]