【问题标题】:find a single quote at the end of a line starting with "mySqlQueryToArray"在以“mySqlQueryToArray”开头的行尾查找单引号
【发布时间】:2014-08-15 15:46:59
【问题描述】:

我正在尝试使用正则表达式在以 mySqlQueryToArray(对 SQL DB 进行查询的函数)开头的行中的任何位置查找单引号(因此我可以将它们全部转换为双引号)。我在 Sublime Text 3 中做正则表达式,我很确定它使用 Perl Regex。我想让我的正则表达式与一行中的每个单引号匹配,例如我可能有以下行:

mySqlQueryToArray($con, "SELECT * FROM Template WHERE Name='$name'");

我希望正则表达式在该行中匹配 $name 周围的两个引号,但该行中没有其他字符。我一直在尝试使用(?<=mySqlQueryToArray.*)',但它告诉我断言背后的外观是无效的。我也试过(?<=mySqlQueryToArray)(?<=.*)',但这也是无效的。有人可以指导我使用可以完成我需要的正则表达式吗?

【问题讨论】:

标签: regex perl sublimetext3


【解决方案1】:

要在以您的关键字开头的行中查找任意数量的单引号,您可以使用 \G 锚点(“最后一次匹配结束”)替换:

(^\h*mySqlQueryToArray|(?!^)\G)([^\n\r']*)'

\1\2<replacement>:见demo here

说明

( ^\h*mySqlQueryToArray  # beginning of line: check the keyword is here
 | (?!^)\G )             # if not at the BOL, check we did match sth on this line
( [^\n\r']* ) '          # capture everything until the next single quote

一般的想法是用([^\n\r']*)' 匹配直到下一个单引号的所有内容,以便用\2<replacement> 替换它,但是只有当这一切都是:

  • 紧跟在开始关键字 (^mySqlQueryToArray) 之后,或者
  • 在最后一场比赛结束后 ((?!^)\G):在这种情况下,我们知道我们有关键字并且在相关行上。

\h* 代表任何开始的缩进,正如 Xælias 所建议的那样(\h 是任何类型水平空白的快捷方式)。

【讨论】:

  • 很好,这很完美。当行缩进时,我只使用(^\s*mySql...
【解决方案2】:

https://stackoverflow.com/a/25331428/3933728 是一个更好的答案。

我对 RegEx 和 ST 都不够好,无法一步完成。但我可以分两步完成:

1/ 搜索所有 mySqlQueryToArray 字符串
打开搜索面板:⌘FFind->Find...
确保您选择了 Regex (.*) 按钮(左下角)和换行选择器(所有其他都应该关闭) 搜索:^\s*mySqlQueryToArray.*$

  • ^ 行首
  • \s* 任何缩进
  • mySqlQueryToArray您的来电
  • .* 后面是什么
  • $ 行尾

点击Find All
这将选择您要修改的每一个匹配项。

2/ 进入替换模式
⌥⌘FFind->Replace...
这一次,确保 wrap、Regex AND In 选择处于活动状态。
他们搜索'([^']*)' 并替换为"\1"

  • ' 是你的单引号
  • (...) si 捕获块,由替换字段中的\1 引用
  • [^']* 用于任何不是单引号的字符,重复

然后点击Replace All

我知道这比其他答案要复杂一些,但这个答案可以解决您的行包含多个单引号字符串的情况。像这样:

mySqlQueryToArray($con, "SELECT * FROM Template WHERE Name='$name' and Value='1234'");

如果这太多了,我想像 find: (?<=mySqlQueryToArray)(.*?)'([^']*)'(.*?) 并用 \1"\2"\3 替换它就足够了。

【讨论】:

  • 可以说是小毛病:如果你不使用它们,你为什么要匹配该行的其余部分(包括.*$\3 组)?还要记住要小心[^']*,与.* 相反,它也会匹配换行符。谢谢你的链接顺便说一句,我很欣赏你的帖子的长度:)
  • 我匆忙添加了这个,我确信这个可以正常工作。这就是为什么\3 有点矫枉过正。并感谢[^'] 精度,但 ST 不匹配此模式中的换行符,这就是原因。
【解决方案3】:

您可以像这样使用正则表达式:

(mySqlQueryToArray.*?)'(.*?)'(.*)

Working demo

检查替换部分。

【讨论】:

  • 我只想匹配该行中的',这会占用整行
  • 你有3个组,你可以参考,\1是第一个'之前的所有内容,\2是引用的文本,\3是后面的所有内容。
【解决方案4】:

你可以使用\K,见这个正则表达式:

mySqlQueryToArray[^']*\K'(.*?)'

这是regex demo

【讨论】:

  • 显然它在您的演示中有效,但当我尝试使用它时它没有检索到任何结果。我不确定那里发生了什么。
猜你喜欢
  • 2021-11-02
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多