regex - 正則表達式數字 - 正則表達式逗號
是否有正則表達式來檢測有效的正則表達式? (6)
是否有可能使用另一個正則表達式檢測有效的正則表達式? 如果是這樣,請給下面的例子代碼。
不太可能。
評估它try..catch
或任何您的語言提供。
儘管在MizardX發佈時使用遞歸正則表達式是完全可能的,但對於這種類型的事情來說,解析器更有用。 正則表達式最初打算用於常規語言,遞歸或平衡組只是一個補丁。
定義有效正則表達式的語言實際上是一種上下文無關語法,您應該使用適當的解析器來處理它。 以下是解析簡單正則表達式的大學項目示例(不含大多數構造)。 它使用JavaCC。 是的,評論用西班牙語,儘管方法名稱是不言自明的。
SKIP :
{
" "
| "\r"
| "\t"
| "\n"
}
TOKEN :
{
< DIGITO: ["0" - "9"] >
| < MAYUSCULA: ["A" - "Z"] >
| < MINUSCULA: ["a" - "z"] >
| < LAMBDA: "LAMBDA" >
| < VACIO: "VACIO" >
}
IRegularExpression Expression() :
{
IRegularExpression r;
}
{
r=Alternation() { return r; }
}
// Matchea disyunciones: ER | ER
IRegularExpression Alternation() :
{
IRegularExpression r1 = null, r2 = null;
}
{
r1=Concatenation() ( "|" r2=Alternation() )?
{
if (r2 == null) {
return r1;
} else {
return createAlternation(r1,r2);
}
}
}
// Matchea concatenaciones: ER.ER
IRegularExpression Concatenation() :
{
IRegularExpression r1 = null, r2 = null;
}
{
r1=Repetition() ( "." r2=Repetition() { r1 = createConcatenation(r1,r2); } )*
{ return r1; }
}
// Matchea repeticiones: ER*
IRegularExpression Repetition() :
{
IRegularExpression r;
}
{
r=Atom() ( "*" { r = createRepetition(r); } )*
{ return r; }
}
// Matchea regex atomicas: (ER), Terminal, Vacio, Lambda
IRegularExpression Atom() :
{
String t;
IRegularExpression r;
}
{
( "(" r=Expression() ")" {return r;})
| t=Terminal() { return createTerminal(t); }
| <LAMBDA> { return createLambda(); }
| <VACIO> { return createEmpty(); }
}
// Matchea un terminal (digito o minuscula) y devuelve su valor
String Terminal() :
{
Token t;
}
{
( t=<DIGITO> | t=<MINUSCULA> ) { return t.image; }
}
好問題。 真正的正規語言不能決定任意深度嵌套良好形式的括號。 也就是說,如果您的字母表中包含'('和')',那麼目標是確定這些字符串是否具有良好匹配的括號。 由於這是正則表達式的必要條件,所以答案是否定的。
但是:如果你放鬆了需求並添加了遞歸,你可以做到這一點。 原因在於遞歸可以作為一個'堆棧',讓你通過推入堆棧來“計算”當前的嵌套深度。
Russ Cox撰寫了關於正則表達式引擎實現的精彩論文: 正則表達式匹配可以簡單而快速
您可以將正則表達式提交給preg_match,如果正則表達式無效,將返回false。 不要忘記使用'@'來抑制錯誤信息:
@preg_match($regexToTest, '');
- 如果正則表達式為'//'則返回1。
- 將返回0,如果正則表達式沒問題。
- 否則返回false。
試試這個...
//regular expression for email
var pattern = /^(([^<>()[\]\\.,;:\[email protected]\"]+(\.[^<>()[\]\\.,;:\[email protected]\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
if(pattern.test(email)){
return true;
} else {
return false;
}
/
^ # start of string
( # first group start
(?:
(?:[^?+*{}()[\]\\|]+ # literals and ^, $
| \\. # escaped characters
| \[ (?: \^?\\. | \^[^\\] | [^\\^] ) # character classes
(?: [^\]\\]+ | \\. )* \]
| \( (?:\?[:=!]|\?<[=!]|\?>)? (?1)?? \) # parenthesis, with recursive content
| \(\? (?:R|[+-]?\d+) \) # recursive matching
)
(?: (?:[?+*]|\{\d+(?:,\d*)?\}) [?+]? )? # quantifiers
| \| # alternative
)* # repeat content
) # end first group
$ # end of string
/
這是一個遞歸正則表達式,並且不被許多正則表達式引擎支持。 基於PCRE的應該支持它。
沒有空白和評論:
/^((?:(?:[^?+*{}()[\]\\|]+|\\.|\[(?:\^?\\.|\^[^\\]|[^\\^])(?:[^\]\\]+|\\.)*\]|\((?:\?[:=!]|\?<[=!]|\?>)?(?1)??\)|\(\?(?:R|[+-]?\d+)\))(?:(?:[?+*]|\{\d+(?:,\d*)?\})[?+]?)?|\|)*)$/
.NET不直接支持遞歸。 ( (?1)
和(?R)
構造)。遞歸必須轉換為計算平衡組:
^ # start of string
(?:
(?: [^?+*{}()[\]\\|]+ # literals and ^, $
| \\. # escaped characters
| \[ (?: \^?\\. | \^[^\\] | [^\\^] ) # character classes
(?: [^\]\\]+ | \\. )* \]
| \( (?:\?[:=!]
| \?<[=!]
| \?>
| \?<[^\W\d]\w*>
| \?'[^\W\d]\w*'
)? # opening of group
(?<N>) # increment counter
| \) # closing of group
(?<-N>) # decrement counter
)
(?: (?:[?+*]|\{\d+(?:,\d*)?\}) [?+]? )? # quantifiers
| \| # alternative
)* # repeat content
$ # end of string
(?(N)(?!)) # fail if counter is non-zero.
壓實:
^(?:(?:[^?+*{}()[\]\\|]+|\\.|\[(?:\^?\\.|\^[^\\]|[^\\^])(?:[^\]\\]+|\\.)*\]|\((?:\?[:=!]|\?<[=!]|\?>|\?<[^\W\d]\w*>|\?'[^\W\d]\w*')?(?<N>)|\)(?<-N>))(?:(?:[?+*]|\{\d+(?:,\d*)?\})[?+]?)?|\|)*$(?(N)(?!))