【问题标题】:perl regex to match ""(string) syntaxperl 正则表达式匹配“”(字符串)语法
【发布时间】:2014-05-10 09:34:24
【问题描述】:

我是 Perl 和正则表达式的新手,我需要从文本文件中提取所有字符串。字符串由用双引号括起来的任何内容来标识。

字符串示例:

"This is string"
"1!=2"
"This is \"string\""
"string1"."string2"
"S
t
r
i
n
g"

代码:

my $fh;

open($fh,'<','text.txt') or die "$!";

undef $/;
my $text = <$fh>;

my @strings = m/".*"/g; # this returns the most out "" in example 4
my @strings2 = m/"[^"]*"/g #fixed the above issue but does not take in example 3

已编辑:我想要 (1) 一个双引号,然后是 (2) 零次或多次出现的非双引号非反斜杠或反斜杠后跟任何字符,然后是 (3)双引号。 (2) 可以是除 "

下面提供的正则表达式 m/"(?:\.|[^"])*"/g 但是当有一行 "string1".string2."string2" 它将返回 "string1" string2 "string3"

有什么地方可以跳过之前匹配的单词吗?

有人可以帮忙吗?

【问题讨论】:

  • 请注意,您想要的是 (1) 双引号,然后是 (2) 零次或多次出现的非双引号非反斜杠或反斜杠后跟任何字符,后跟 (3) 双引号。

标签: regex string perl


【解决方案1】:

一种可能的方法:

/"(?:\\.|[^"])*"/

... 读作:

  • 匹配双引号,
  • 后跟任意数量的...

    --- 任何转义字符(任何以\ 开头的符号)

    --- 或任何不是双引号的字符

  • 后跟双引号

这里的关键技巧是使用替换 any 转义符号 - 包括转义的双引号。

Demo.

【讨论】:

  • 感谢您的解释,它现在正在工作..!!在此之前,我不知道 ?: 在 perl 正则表达式中。谁能解释那是什么或给我一个消息来源?谢谢!
  • 它用来标记一个所谓的non-capturing group——当你只需要将一系列表达式分组到一个模式中,而不是存储这个分组的结果时。我建议查看this thread 以获得详细说明。
  • 感谢您的信息。现在对非捕获组的工作方式有了更好的了解。我发现如果有"string1".$string2."string3",上面的不起作用,它会返回"string1" string2 string3 是否可以跳过perl正则表达式中先前匹配的字符?
  • "string1".$string2."string3""string1""string3" 都匹配,如果您正确使用该模式。 Proof.
  • 谢谢raina77ow!!正则表达式中的输入错误会导致很多不合理的结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2017-08-29
  • 1970-01-01
  • 2012-06-05
  • 2013-12-25
相关资源
最近更新 更多