【问题标题】:How to replace double quotes if found only only as 1st and last character in a multiline string?如果仅发现多行字符串中的第一个和最后一个字符,如何替换双引号?
【发布时间】:2019-11-22 19:30:28
【问题描述】:

这里不完全是一个正则表达式天才,但到目前为止我有这个:(?>^)"|^(?!"$) 和这个(?>^)"(?<$)"

但它只在第一个正则表达式中捕获第一个双引号,后者抛出错误。

这是一个简短的多行字符串示例:

8433|NTC Nano Tech Coatings GmbH|Marpinger Weg 2|||Tholey||D-66636|DE|1|EUR|        
"8434|Piramal Enterprises Ltd,|Plot No: 18, ""PHARMEZ"",|Pharma Special Economic|Zone,Sarkhej-Bawla NH #8AVilla|Ahmedabad||382213|IN|20|USD|"       
"8435|PolyDrop, LLC|22431 76th AVE S|||Kent|WA|98032|US|7|USD|"     

我需要一种方法来通过正则表达式解析它以删除每行上的第一个“和最后一个”,但不要触及行内的任何其他双引号。如果它们是一行的第一个和最后一个字符,则仅将它们替换为空字符串。

有人可以帮我吗?似乎我在尝试获取行的最后一个字符的最后一个双引号时做错了。

【问题讨论】:

  • 要匹配行上的第一个和最后一个双引号,请使用(?m)^"|"$
  • 什么是正则表达式解析器?
  • PCRE 我想用 PHP。 @WiktorStribiżew 看起来我还需要考虑行尾的额外空格。
  • 喜欢(?m)^\h*\K"|"(?=\h*$)?
  • @WiktorStribiżew - 我相信这行得通。为什么理解正则表达式这么难?我真的需要更好地学习这门语言。

标签: regex csv


【解决方案1】:

要匹配第一个和最后一个双引号,占第一个和最后一个引号之后的任何空格,您可以使用

(?m)^\h*\K"|"(?=\h*$)

请参阅regex demo。

详情

  • (?m) - 多行选项使 ^ 和 $ 匹配行的开头和结尾
  • ^ - 行首
  • \h* - 0+ 个水平空格
  • \K - 匹配重置运算符,它忽略了远离内存缓冲区的文本匹配
  • " - 双引号
  • | - 或
  • " - 双引号...
  • (?=\h*$) - (正向前瞻,非消耗模式)后跟 0+ 个水平空格和行尾位置。

【讨论】:

  • 哦,我只知道\K。这是一个有助于回顾的捷径。这在 Python 中有效吗?
  • @justhalf \K 在 Python re 中不受支持,但它在 Python PyPi regex 模块中有效。见demo。但是,要删除 Python 3.5+ 中的这些引号,我会使用 re.sub(r'(?m)^([^\S\r\n]*)"|"(?=[^\S\r\n]*$)', r'\1', text, flags=re.M) (demo)
猜你喜欢
  • 2014-02-12
  • 2013-09-19
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2022-11-01
  • 2012-08-07
  • 1970-01-01
相关资源
最近更新 更多