当前位置: 首页 > 知识库问答 >
问题:

使用正则表达式,如何有效地在双引号和嵌入双引号之间匹配字符串?

臧弘和
2023-03-14
"He said \"Hello\" to me for the first time"

共有1个答案

胡俊贤
2023-03-14

匹配这些输入的一个非常有效的解决方案是使用normal*(特殊normal*)*模式;这个名字引自杰弗里·弗里德尔的优秀著作《掌握正则表达式》。

这是一种模式,通常用于匹配由常规条目(正常部分)和中间分隔符(特殊部分)组成的输入。

注意,像所有的东西regex一样,它应该在没有更好的选择时使用;虽然可以使用此模式解析CSV数据,例如,如果使用Java,则最好使用OpenCSV。

"He said \"Hello\" to me for the first time"
    null

将其替换到normal*(special normal*)*模式中,将得到以下regex:

[^\\"]*(\\"[^\\"]*)*

添加双引号以匹配全文,将得到最终的regex:

"[^\\"]*(\\"[^\\"]*)*"

您将注意到,这也将匹配空引号字符串。

    null
the-word-to-match
  • 正常:小写ASCII字母:[a-z]
  • 特殊:破折号:-

该模式的规范形式是:

[a-z]*(-[a-z]*)*

但正如我们所说:

    null
[a-z]+(-[a-z]+)*
\b[a-z]+(-[a-z]+)*\b
    null

它给出了表达式(用单词锚点装饰):

\b\d{1,3}(\.\d{1,3}){3}\b

这种模式的灵活性使其成为regex工具箱中最有用的工具之一。虽然存在许多问题,如果库存在,则不应使用正则表,但在某些情况下,必须使用正则表。这将成为你最好的朋友之一,一旦你练习了一点!

  • 很可能不需要(或不希望)捕获重复的部分((特殊规范*)部分);因此,建议您使用非捕获组。例如,对带引号的字符串使用“[^\\”]*(?:\\“[^\\”]*)*“。实际上,如果您想要捕获,在这种情况下捕获几乎永远不会导致预期的结果,因为重复捕获组只会给您最后一次捕获(以前的所有重复都会被覆盖),除非您在.NET中使用这种模式。(谢谢@Ohaal)

 类似资料:
  • 我面临一个挑战,要以以下格式匹配输入: 输入由key=value对组成。关键字以斜杠开头。值可以是数字或引号中的字符串。 该值可以选择性地包含转义引号,即引号后面跟着引号(“”)。这种转义引号应该被视为价值的一部分。不需要检查转义引号是否平衡(例如,由另一个转义引号结束)。 正则表达式应该匹配序列中给定的key=value部分,并且对于长输入(例如value是10000个字符)不应该中断。

  • 我想解析以下字符串: 我正在使用,所以我这里缺少的是正确的正则表达式。规则是正则表达式必须: 隔离任何单个单词 任何用双引号括起来的子字符串都是匹配的 单词中的双引号必须忽略(稍后我将用空格替换它们)。 因此,结果匹配应该是: < li>w1 w"2 < li>w3 < li>| < li>w4 < li>w"5 < li>w6 w7 双引号是否包含在双引号括起来的子字符串中是无关紧要的(例如,1

  • 有没有一种方法使组的“capture”可以在regex后面引用,但其捕获的值不在匹配列表中返回? 或者其他一些方法来解决我(看似简单)的问题。

  • 问题内容: 我需要使用正则表达式,检查一个字符串以a开头 的双引号 字符(),用两端 的双引号 字符了。 问题是我不能使用 双引号 字符,导致混淆。还有其他方法可以在正则表达式中或一般在字符串中表示 双引号 字符吗? 问题答案: 首先,双引号字符在regex中没什么特别的-它只是另一个字符,因此 从regex的角度来看 不需要转义。 但是,由于Java使用双引号 分隔 字符串常量,因此,如果要在J

  • 这是我之前问题的后续。我意识到我需要更具体地说明我的regex案例,以获得适用于我的案例的答案。 我已经与这个正则表达式斗争了很长一段时间(也使用我上一个问题的答案),我似乎无法构建我需要的东西。 我需要将所有字符串中出现的两个重复出现的单引号替换为(因此字符串内部意味着单引号)。这是因为在一种语言(语法)中,字符串中的引号使用<code>‘转义。 这里有一个例子(实际的例子可以包含用< code

  • 问题内容: 我写了一个正则表达式,用double-qoutes分割字符串: 如何将其扩展为与单双qoutes一起使用? 我试过了: 但这是行不通的 问题答案: 有两种方法: