【问题标题】:how to extract string with any operator between?如何使用任何运算符提取字符串?
【发布时间】:2016-03-05 06:27:22
【问题描述】:

我有一个包含@arr = { "a=b", "a>b", "a<b", "a!=b", "a-b" } 的数组。使用任何运算符获得 a 和 b 的最佳方法是什么。我可以通过

提取
for($i=0; $i<=$#arr; $i++){
   $str = $arr[$i];
   if($str =~ m/^(.*?)(\s*=\s*)(.*)(;)/g){
         my $d = $1;
         my $e = $3;
   }

在所有 if 语句后面加上"!=", "&lt;" 等可能的运算符。但这会使我的代码看起来很乱。有没有更好的解决方案?

【问题讨论】:

  • 我能知道谁否决了这个问题以及原因吗?谢谢

标签: regex perl


【解决方案1】:

你可以试试这样的一个班轮

perl -e '@a = ("a=b","a>b","a<b","a!=b","a-b"); for $l (@a) { $l =~ s/(.).*(.)/$1/; print "$1$2\n"};'

关键是两个单字符匹配即“(.)”之间的贪婪匹配即“(.*)”。要真正确保您从字符串的开头和结尾开始,您可以使用这个

perl -e '@a = ("a=b","a>b","a<b","a!=b","a-b"); for $l (@a) { $l =~ s/^(.).*(.)$/$1/; print "$1$2\n"};'

演示整个事情的完整工作示例是

#!/usr/bin/perl
use strict;
use warnings;
my @expressions = ("a=b","a>b","a<b","a!=b","a-b"); 
for my $exp (@expressions) { 
  $exp =~ s/^(.).*(.)$/$1$2/; 
  print "$1$2 is the same as $exp\n";
};

【讨论】:

    【解决方案2】:

    一个非常简单的正则表达式可能是

    /^(\w+)\s*(\W+)\s*(\w+)$/
    

    或者你列举可能的操作符

       /^(\w+)\s*(=|!=|<|>|<=|>=|\+|-|\*|\/|==)\s*(\w+)$/
    

    这取决于输入是否可信。如果没有,您可能必须更加细致。标识符也是如此。这是一个更简单的循环,无需使用 m//g(lobal)。不确定分号 - 省略它。

    my @arr = ( "a=b", "a>b", "a<b", "a!=b", "a-b" );
    for my $str (@arr){
        if($str =~ /^(\w+)\s*(=|!=|<|>|<=|>=|\+|-|\*|\/|==)\s*(\w+)$/ ){
             my $d = $1;
             my $e = $3;
             print "d=$d e=$e\n";
        }
    }
    

    以后如果枚举运算符,还可以加单词符号:

    if($str =~ /^(\w+)\s*(=|!=|<|>|<=|>=|\+|-|\*|\/|==|x?or|and)\s*(\w+)$/ ){
        ...
    

    【讨论】:

    • 感谢它的工作!如果我的'@arr = ( "a and b", "a or b", "a nor b" )' 还有一个问题。我也可以使用一条评论来完成吗?
    【解决方案3】:

    如果开头和结尾总是有'a'和'b',你可以试试:

    my $str =  'a<b';
    my( $op ) = $str =~ /^a(.*)b$/;
    

    【讨论】:

      【解决方案4】:

      不是一个深思熟虑的答案。会重新考虑这个问题。

      【讨论】:

        猜你喜欢
        • 2020-09-30
        • 1970-01-01
        • 1970-01-01
        • 2021-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-03
        • 1970-01-01
        相关资源
        最近更新 更多