【问题标题】:The Regex `## Example[^]+### Response` cannot be matched正则表达式`## Example[^]+### Response`无法匹配
【发布时间】:2018-01-11 15:32:31
【问题描述】:

我有大量的降价文件。在这些文件中,我想将某些### Response 替换为### ResponseNew

### Response
I don't want to replace this Response above to ResponseNew since it is not following Example

## Example
### Request
123{}```

### Response
I want to replace this Response above to ResponseNew since it is following Example

所以我尝试使用

## Example[^]+### Response

替换为

$&New

当我在 RegExr website 中进行测试时,此方法有效。

但是,使用Sublime查找替换,却显示错误:

字符类声明中的 [ 或 [^ 不匹配。发生错误 在解析正则表达式片段时:'# Response>>>HERE>>>'。 在正则表达式中 ## Example[^]+### 响应

我还尝试在this 之后的终端中使用 Perl,

find . -type f -exec perl -p -i -e "s/## Example[^]+### Response/$&New/g" {} \;

它显示:

正则表达式中不匹配的 [;标记为

如何正确编写正则表达式以便匹配?谢谢

【问题讨论】:

  • Perl 中不存在 [^] 成语。
  • Regexr 不支持 Perl 正则表达式语法。它只对测试 JavaScript 正则表达式有用。
  • 我可以使用任何其他正则表达式来代替 [^] 吗?谢谢
  • (?s:.), /./s。使用带点的s 修饰符。 [^] 在 ECMAScript 标准中的意思是 not nothing = any char
  • OTOH,Perl 将[^] 视为[^\]...

标签: regex perl


【解决方案1】:

如果文件不是太大

perl -0777 -wpe's/## Example.*?### Response\K/New/sg' markdown.txt

使用提供的输入打印正确的输出。

/s 修饰符使. 也匹配换行符,\K 使其删除以前的匹配项,因此您不必“替换”它们。因此,一旦匹配,它就会将 New 直接添加到 Response 上。 -0777 开关使其将整个文件吞入$_,这是跨多行工作所必需的。

如果### Response 可能出现在一行的中间,而您不想在那里触摸它

perl -0777 -wpe's/## Example.*?^### Response\K/New/smg' markdown.txt

其中/m 修饰符使^ 匹配每行的开头,而不仅仅是整个字符串。


如果文件 太大而无法放入变量中,请在找到 ## Example 时设置一个标志,然后在找到 ### Response 后(标志为 true)替换它并取消设置标志.

如果必须的话,这在单行中是可行的,但我建议使用简短的脚本。

【讨论】:

  • 感谢您的提示!
【解决方案2】:

在逐行和slurp模式之间,您还可以定义自己的记录分隔符并选择## Example。那么你所要做的就是为每条记录替换第一次出现的### Response

perl -pe'BEGIN{$/="## Example"} s/### Response\K/New/ if $a++' file

【讨论】:

  • 也感谢您提供的信息!
猜你喜欢
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 2016-01-01
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多