我应该使用什么REGEX模式来查找特定的字符串模式并删除任何其他不匹配的模式?

时间:2012-01-27 20:51:11

标签: regex perl parsing

我正在解析代码在我的IDE中使用Perl-REGEX解析引擎,我想抓住任何看起来像

的变量
$hash->{ hash_key04}

并核实其余代码..

到目前为止,我的基本REGEX并没有达到我的预期

(.*)(\$hash\-\>\{[\w\s]+\})(.*)


(
\$
hash
\-\>
\{
  [\w\s]+
\}
)

我知道要使用替换($ 1,$ 2等),但在目标字符串之前和之后匹配(。*)似乎并不捕获所有其余代码!

UPADTED: 尝试匹配null但当然太贪心了。

([^\0]*)

我应该使用正则表达式中的哪个表达式来查找字符串模式并删除其余部分?

问题是我想在IDE中运行替换后留下$ hash-> {}字符串列表。

5 个答案:

答案 0 :(得分:2)

从另一个方向更好地接近。而不是试图删除你不想要的一切,如何提取你想要的一切?

my @vars = $src_text =~ /(\$hash->\{[\w\s]+\})/g;

打破正则表达式:

    /(                  # start of capture group
       \$hash->         # prefix string with $ escaped
       \{               # opening escaped delimiter
        [\w\s]+         # any word characters or space
       \}               # closing escaped delimiter
    )/g;                # match repeatedly returning a list of captures

这是另一种可能更适合您的IDE的方式:

s/(\$hash->\{[\w\s]+\})|./$1/gs;

这个正则表达式尝试匹配每个位置的一个哈希变量,如果它失败,它会删除下一个字符,然后再次尝试,在遍历整个文件后,它将删除你不想要的所有内容。 / p>

答案 1 :(得分:0)

这取决于平台,但通常用空字符串替换模式。

在javascript中,

// prints "the la in ing"
console.log('the latest in testing'.replace(/test/g, ''));

在bash中

$ echo 'the latest in testing' | sed 's/test//g'
the la in ing

在C#中

Console.WriteLine(Regex.Replace("the latest in testing", "test", ""));

答案 2 :(得分:0)

取决于您的编码语言。你想要的是第2组(括号中的第二组字符)。在perl中,这将是2美元,在VIM中它将是\ 2,等等......

答案 3 :(得分:0)

默认情况下,通配符.与新行不匹配。您可以使用标志在其匹配集中启用换行符,具体取决于您正在使用的正则表达式标准以及使用的语言/ api。或者您可以通过定义字符集来自己添加它们:

[.\n\r]*    <- Matches any character including newline, carriage return.

将此与捕获组合并从代码中获取所需的变量,并跳过不包含捕获组的行。

如果您需要帮助为您的上下文构建正确的正则表达式,您需要粘贴一些输入文本并指定输出应该是什么。

答案 4 :(得分:0)

我认为你想在正则表达式的开头添加一个^ /。(PATTERN)(。)$ / $ 1 /以便它从行的开头开始然后去最后,删除除该模式之外的任何内容。