2010-09-14 46 views
1

我有一個從配置文件中讀取的python腳本。配置文件將包含一些用戶定義的正則表達式模式。但是,我想我想讓用戶使用完整的正則表達式模式或OR通配符。所以,我應該能夠解釋這兩種混合正則表達式和外殼通配符

*.txt
以及
.*\.txt$
正確。所以這兩個應該是等價的。

但是,我希望能夠做到這一點,而不會讓用戶告訴我他們正在使用。這甚至有可能嗎?也許允許完整的正則表達式是矯枉過正的。

+2

我不認爲你可以明確地確定一個給定的模式是什麼。即使在這種情況下,第一個模式不是一個有效的正則表達式,你怎麼知道它是一個「shell通配符」還是一個無效的(錯誤輸入的)正則表達式? – NullUserException 2010-09-14 06:11:26

+0

這正是我問這個問題的原因,我不知道它是否可行=] – Falmarri 2010-09-14 06:14:42

+0

有些shell(至少zsh)可以讓你自由地混合這些東西,並且仍然(通常)做正確的事情。正如NullUserException所述:毫不含糊地說,不。 – 2010-09-14 06:15:36

回答

2

你不能這樣做。 prefix.*應該匹配什麼?那麼somefiles?呢?這些在正則表達式和全局匹配中有着非常不同的含義,但在兩者中都是常見的用例。

0

考慮,例如,圖案

foo?.txt 

在圓頂封裝體的語法,這將匹配foo1.txt,fooZ.txt但不fo.txt,fob.txt或fooZtxt 在正則表達式syntaxt,這將匹配fo.txt,foQtxt,但不匹配fooZ.txt

您無法明確地接受這兩種語法。我能想到的唯一的選擇就是讓用戶前綴的表達,即

regexp:foo?.txt 
1

一個可能的辦法是:

  1. 試圖編譯給定的表達式爲正則表達式。

    a。如果失敗(語法錯誤),請使用表達式作爲全局字符串。

    b。如果它不能編譯失敗,請將其用作正則表達式。

  2. 如果它不匹配任何內容,請將其用作glob字符串。

在任何情況下,告訴你做了什麼用戶(「解釋pattern.*爲正則表達式」),並允許他重寫不管你已經猜到了。畢竟,正如Zak Thompson所寫,一些模式將是有效的正則表達式和全局模式。

需要考慮的另一件事是用戶可以通過catastrophic backtracking通過正則表達式輕鬆過載或系統崩潰。所以除非你的用戶自己的機器,你可能想考慮允許正則表達式放在首位。

+0

是的,這將在用戶的個人機器上運行 – Falmarri 2010-09-14 06:39:30

0

儘量不要將正則表達式的創建留給用戶。用戶應該有一個更簡單的方法來配置他們的文件,而不需要使用正則表達式。例如,讓用戶有幾個選擇,

  1. 開始與
  2. 包含(OR和AND)

然後作爲程序員,你使用這些選擇結束構建你的正則表達式。

+0

這就是爲什麼我試圖使用兩者。我也會親自使用這個程序,實際上我主要是爲自己寫的。所以我想支持正則表達式匹配。 – Falmarri 2010-09-14 06:57:07