【问题标题】:Regular Expression: match only non-repeated occurrence of a character正则表达式:仅匹配不重复出现的字符
【发布时间】:2011-05-20 09:58:38
【问题描述】:

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

那是

abc'def

是匹配但

abc''定义

不匹配。

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

谢谢,

瓦莱里

【问题讨论】:

  • 这是什么环境?珀尔? Javascript? php?爪哇? POSIX?并非所有的正则表达式语法都是一样的。

标签: regex


【解决方案1】:

取决于您的环境 - 如果您的环境支持前瞻和后瞻,您可以这样做:(?<!')'(?!')

参考:http://www.regular-expressions.info/lookaround.html

【讨论】:

  • 谢谢,这正是我想要的。
【解决方案2】:

我认为您的模式简短而精确。您可以使用负前瞻/后视,但它们会使它变得更加复杂。可维护性很重要。

【讨论】:

  • 是的,我已经使用正则表达式多年了,昨天才花时间了解前瞻和后瞻,因为 stackoverflow 问题。可能比功能更能说明我,但最重要的是,即使您对正则表达式有更基本的了解,原始版本也很清晰,并且在所有环境中都是一致的。
  • @Tao: 这正是我要说的:)
  • 完全同意,虽然上面的前瞻/后瞻示例很好、简短且正确,但我自己的原始版本对于非正则表达式的开发人员来说更容易理解。仍然怀疑使用哪种方法:)
【解决方案3】:

你必须小心撇号的奇数:

abc'''def

您可能确实想要替换第 3rd 个并保留第 1st 和 2nd在那里。

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

搜索模式:

(('')*)'

替换成

$1

这是第 1 组:偶数撇号(或根本没有撇号)。

我不确定您要解决的实际问题是什么,但如果您要解析/读取 CSV 文件或具有 CSV 输入之类的字符串,我强烈建议您使用像样的 CSV 解析器。几乎所有语言都以某种形式拥有它们。

【讨论】:

  • 不,这不是 CSV。实际上,我正在解决一个吞下单个撇号字符的 Java 类 MessageFormat 问题。
【解决方案4】:

看这里消极的lookahed q(?!u)

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

http://www.regular-expressions.info/lookaround.html

working DEMO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 2016-10-24
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多