【问题标题】:Looking for a regular expression solution寻找正则表达式解决方案
【发布时间】:2013-03-31 14:39:54
【问题描述】:

我正在寻找与前两个特定字段(用 Perl 编写的变量字符串)匹配的正则表达式。在文件中,没有注释的行 # 以任何字符开头,长度不特定,后跟空格,另一个非特定长度字符串,后跟空格:name info data1 data2 data3

以下仅用于匹配第二个字段,但我希望前两个字段完全匹配:/^[^#].*\s$INFO\s/ where $INFO="info"。我尝试了上述的变体无济于事。我的第一次尝试是这样的:/^[^#]$NAME\s$INFO\s/ 如果$NAME="name" 用于上述记录,这​​对我来说似乎是合乎逻辑的。

【问题讨论】:

  • 给我们一个完整字符串的例子以及你想要的。
  • 在帖子里。 "name info data1 data2 data3" 我只关心 "name" 和 "info" 是否匹配,其余的我不关心。但前两个字段将是可变的字母数字字符串。
  • 这样吗?我无法理解初始字符串到底是什么。 \#{0}(\w*) (\w*) \w* \w* \w*
  • 所以基本上你需要的是匹配前面没有#的前两个单词?
  • 这是一个真实的声明 HamZa。基本上我正在运行一个读取公共文件的 perl 脚本,前两个字段代表服务器名称和一个程序实例,我希望根据这两个字段设置一些环境变量,因为这个程序的两个实例可以在同一台服务器,但会有不同的环境,其余的字段加上我可以防止其他服务器在另一台服务器的环境中运行相同的脚本。仅匹配实例字段(第二个字段)并不能阻止这种情况。实例由 C/L 选项设置,服务器由程序设置。

标签: regex perl


【解决方案1】:

我的第一次尝试是这样的:/^[^#]$NAME\s$INFO\s/

这行不通,因为(从问题中暗示)$NAME 之前的字符不是# 或者什么都没有。因此,您只需要删除第一个 [^#]:

/^$NAME\s$INFO\s/

将匹配字符串:

"$NAME $INFO <whatever or nothing>"

【讨论】:

  • 我通过对两个不同的正则表达式进行双重测试来解决这个问题if($line =~ /^[^#].*\s$INST\s/ &amp;&amp; $line =~ /^$HOST\s/) 第二个不需要检查注释字符,因为第一个已经检查了。感谢 AD7six,当我 10 年前写这篇文章时,我从那个开始但担心#。在我的情况下,它总是可以工作,因为 field1 是主机名并且 # 是非法的。我希望管理员能够注释掉一个条目。我现在正在修改代码以使用 ssh,看到这个并说'哦,那不对'但答案太简单了,我想多了!
【解决方案2】:

虽然我不是正则表达式专家,但这可能有效(我也不清楚问题的确切细节,所以我做了一些假设):

'$NAME=name #$INFO=info $DATA=data1 data2 data3'.replace(/#[\S]+/g,'').match(/\$[\S]+/g);

这将返回一个数组。前 2 个元素是“字段”,即 [0]='$NAME=name' AND [1]='$DATA=data1'

希望对您有所帮助。并为我的正则表达式向众神道歉。

【讨论】:

    猜你喜欢
    • 2017-08-25
    • 2017-01-15
    • 2018-11-21
    • 1970-01-01
    • 2010-10-25
    • 2013-09-29
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多