2013-03-01 45 views
0

我需要一個最佳正則表達式來匹配文本文件中的所有這三種類型的文本。單一正則表達式不適用於三種不同的模式

  1. [TRUE,FALSE]
  2. [4,5,6,7]
  3. [2-15]

我試圖未工作

以下的正則表達式匹配
m/([0-9A-Fa-fx,]+)\s*[-~,]\s*([0-9A-Fa-fx,]+)/) 
+1

你說的意思是'不working'? – Toto 2013-03-01 12:29:03

+0

TRUE中的T,R和U與您的正則表達式不匹配 – orique 2013-03-01 12:29:25

回答

2

4-72-15的子集。此正則表達式應該捕捉它們:

/TRUE|FALSE|[2-9]|1[0-5]/ 
+0

我不明白這可能與'[4,5,6,7]'匹配。我的意思是,它確實匹配,但只有第一個小數。我認爲你對(不完整)問題描述的解釋太過分了。 – memowe 2013-03-01 15:09:07

3
/ 
    (?(DEFINE) 
     (?<WORD> [a-zA-Z]+) 
     (?<NUM> [0-9]+) 
    ) 

    \[ \s* 
    (?: (?&WORD) (?: \s* , \s* (?&WORD))+ 
    | (?&NUM) (?: \s* , \s* (?&NUM))+ 
    | (?&NUM) \s* - \s* (?&NUM) 
    ) 
    \s* \] 
/x 
+0

Upvote命名捕獲。但是5.10+。 – rjh 2013-03-01 13:13:06

+0

@rjh,如果要避免5.10特徵,可以將定義內聯,但如果要進行更改,則必須在兩個或四個位置編輯定義。 – ikegami 2013-03-01 14:35:18

0

一個quick'n'dirty測試程序:

#!/usr/bin/env perl 

use strict; 
use warnings; 

for my $line (<DATA>) { 

    chomp $line; 
    print "$line: "; 

    if ($line =~/
      ^         # beginning of the string 
      \[         # a literal opening sq. bracket 
      (         # alternatives: 
        (TRUE|FALSE) (,(TRUE|FALSE))*  # one or more thruth words 
       | (\d+) (,\d+)*      # one or more numbers 
       | (\d+) - (\d+)      # a range of numbers 
      )         # end of alternatives 
      \]         # a literal closing sq. bracket 
      $         # end of the string 
     /x) { 

     print "match\n"; 
    } 
    else { 
     print "no match\n"; 
    } 
} 

__DATA__ 
[TRUE] 
foo 
[FALSE,TRUE,FALSE] 
[FALSE,TRUE,] 
[42,FALSE] 
[17,42,666] 
bar 
[17-42] 
[17,42-666] 

輸出:

[TRUE]: match 
foo: no match 
[FALSE,TRUE,FALSE]: match 
[FALSE,TRUE,]: no match 
[42,FALSE]: no match 
[17,42,666]: match 
bar: no match 
[17-42]: match 
[17,42-666]: no match 
相關問題