2015-10-19 60 views
0

我有一個單一的線:正則表達式來驗證串用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並查找「字符串」類型,它將顯示您可以使用「conformRegex」,然後使用正則表達式來驗證字符串。 Cloudera SDL parameter types

如何創建一個單一的正則表達式來完成上述所有功能?

+1

你真正的問題是什麼? –

+0

在論壇發佈加入提問 –

+1

你嘗試過什麼正則表達式?你的「應用程序」支持什麼版本的正則表達式?你的'cut |怎麼樣? sed'嘗試不允許? –

回答

0

您可以將regexp一起串入一個正則表達式中,以開始和結束「錨定」和「不」字符組的方式準確告訴應用程序您想要的應用程序:

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

請注意它如何只允許2個空格(所有其他表達式不包括空格)。

+0

上面的示例數據中的第3個「字段」後面顯示空格。沒有上述正則表達式匹配的空間regexr。如果(可選)拖尾空間是「允許的」,那麼在上面的'$'前面插入'\ s *'。 –

+0

這一個工程...謝謝! –

+0

Opps,正則表達式匹配任何\它只需要匹配一個\\。 –

0

如果AWK是允許的,然後驗證可以很容易地做到如下 創建AWK文件(myvalidation.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 
所有記錄
+0

awk是不允許的。 –