Regex 正则表达式:仅匹配字符的非重复出现

Regex 正则表达式:仅匹配字符的非重复出现,regex,Regex,我需要查找并替换字符串中所有出现的撇号字符,但前提是该撇号后面没有另一个撇号 就是 abc'def 这是一场比赛,但是 abc“def 这不是一场比赛 我已经编写了一个工作模式-(^ |[^'])”($|[^']),但我相信它可能会更短、更简单 谢谢 瓦莱里我认为你的图案简短而精确。你可以使用消极的向前看/向后看,但它们会使事情变得更加复杂。可维护性很重要。您必须小心撇号数量不均匀: abc'''def 您可能确实想替换第三个,并将第一个和第二个留在那里 您可以这样做(假设您已经匹配了字符串文

我需要查找并替换字符串中所有出现的撇号字符,但前提是该撇号后面没有另一个撇号

就是

abc'def

这是一场比赛,但是

abc“def

这不是一场比赛

我已经编写了一个工作模式-
(^ |[^'])”($|[^'])
,但我相信它可能会更短、更简单

谢谢


瓦莱里

我认为你的图案简短而精确。你可以使用消极的向前看/向后看,但它们会使事情变得更加复杂。可维护性很重要。

您必须小心撇号数量不均匀:

abc'''def
您可能确实想替换第三个,并将第一个和第二个留在那里

您可以这样做(假设您已经匹配了字符串文字,并且只想替换编号不均匀的尾随撇号):

搜索模式:

(('')*)'
并将其替换为

$1
第1组:偶数撇号(或者根本没有撇号)


我不确定您正在解决的实际问题是什么,但如果您正在解析/读取CSV文件,或具有类似CSV输入的字符串,我强烈建议您使用合适的CSV解析器。几乎所有的语言都有这样或那样的形式。

参见这里的nagative lookahed
q(?!u)

  • (?=pattern)
    是一个积极的前瞻性断言
  • (?!pattern)
    是一个否定的前瞻性断言
  • (?
    

取决于您的环境-如果您的环境支持向前看和向后看,您可以这样做:
(?像这样??这是什么环境?Perl?Javascript?PHP?Java?POSIX?并不是所有的正则表达式语法都是相同的。ye,我已经使用正则表达式多年了,昨天才花时间了解了lookahead和lookahead,因为有一个stackoverflow问题。可能更多的是关于我,而不是特性,但底线是原始版本即使您对regexp有了更基本的了解,也很清楚,并且在所有环境中都是一致的。@Tao:这正是我要说的:)完全同意,虽然上面的lookahead/lookahead示例很好、简短且正确,但对于不懂正则表达式的开发人员来说,我自己的原始版本更容易理解。仍不确定使用哪种方法:)谢谢,这正是我想要的。不,这不是CSV。事实上,我正在解决一个Java类MessageFormat的问题,该类包含一个撇号字符。如果我做错了什么,很抱歉。我是第一次使用stackoverflow。