用正则表达式验证一个包含3个字段/组的字符串,每个字段/组都需要进一步验证



我只有一行:

file:///var/run/storm/blah.jar storm.starter.ExclamationTopology exclamation-topology 

由3个(不多不少)以一个空格分隔的字段/组组成。

  1. 第一个字段需要以file://hdfs://开头
  2. 第二个字段没有限制。
  3. 第三个字段不能包含. / : \

我习惯使用几个正则表达式来工作像这样的一些语言逻辑围绕它…如cut -d' ' -f1 | sed -e 'regex here'。但是我正在使用的应用程序不允许这样做,我真的很难弄清楚如何做到这一点。

我尝试了一些/(b[^s]+b){3,3}/g的行,但如果我添加第四个字段,它有任何数字,.,-等,它将匹配。我也不知道如何在第一个或第三个特定字段上执行正则表达式。

我不能使用cut | sed,因为它需要一个单一的正则表达式。这个应用程序是Cloudera Manager,不幸的是他们的文档很糟糕。它只是说它是一个正则表达式。如果您转到以下url并查找"string"类型,它将显示您可以使用"conformRegex"后跟一个regex来验证字符串。Cloudera SDL参数类型

我如何创建一个单一的正则表达式做上述所有的功能?

你可以将regexp的字符串组合成一个regexp来告诉应用程序你想要什么,开始和结束"锚定"one_answers"非"字符组:

^(file://|hdfs://)[^ ]* [^ ]+ (\?[^./:\ ]+)+\?$

注意它只允许2个空格(所有其他表达式都不允许空格)。

如果允许awk,那么验证可以很容易地完成,如下所示创建awk文件(myvalidate .awk)

# myvalidation.awk
{
  # assume all records are good
  v_bad_record = 0;
  # set the bad record flag to 1 if first field not starting with file:// or hdfs://
  if ( $1 !~ /^file:/// &&  $1 !~ /^hdfs:/// )
  v_bad_record = 1;
  # set the bad record if 3rd field has any of . :  /
  if ( $3 ~ /[.:/\]/ )
  v_bad_record = 1;
  # print bad record only
  if ( v_bad_record == 1 )
  print $0;
  # if you want to print good record then comment above 2 lines and uncomment below 2 lines
  # if ( v_bad_record == 0 )
  # print $0;
}

然后运行如下命令,它将打印所有验证失败的记录

$ awk -f myvalidation.awk datafile.txt

最新更新