2012-02-21 7 views
5

Dov'è l'ordine di precedenza dell'operatore documentato per la classe .NET Regex?Dov'è la precedenza dell'operatore documentata per la classe .NET Regex?

Vedo this, ma quello è per JScript.

Inoltre, sembra che questo non è influenzata da RegexOptions.ECMAScript, ma la conferma sarebbe utile.

+0

È possibile vedere l'espressione che ti confonde? – zerkms

+1

La precedenza è uguale a quella nel collegamento JScript: gli operatori unari eseguono il binding più stretto, quindi la concatenazione, quindi l'alternanza. Le staffe funzionano come ti aspetteresti. – porges

+0

@zerkms, sto scrivendo espressioni e voglio sapere quando ho bisogno di parenti. Porges, è quello che spero, ma mi piacerebbe vederlo documentato. Se non lo è, presenterò un bug Connect. –

risposta

1

Non credo che la vera risposta sia semplice come vorresti. La breve (e incompleta) risposta è semplicemente "tutte le espressioni vengono valutate da sinistra a destra" ...

Per la risposta a lungo andare qui.

http://msdn.microsoft.com/en-us/library/e347654k.aspx

Il motore delle espressioni regolari NET Framework è un backtracking regolare espressione matcher che incorpora un motore tradizionale non deterministico Finite Automaton (NPC) ... motori tradizionali NFA eseguono pattern matching, loro l'ordine di elaborazione è guidato dal modello di espressione regolare. Mentre elabora un particolare elemento di linguaggio, il motore utilizza una corrispondenza avara; cioè, corrisponde alla maggior parte della stringa di input il più possibile. Ma salva anche il suo stato dopo il che soddisfa correttamente una sottoespressione. Se una corrispondenza fallisce, il motore può tornare a uno stato salvato in modo che possa provare altre corrispondenze .

Modifica: Hai dimenticato di rispondere alla seconda parte della tua domanda.

Per quanto riguarda RegexOptions.ECMAScript, è possibile fare riferimento questi documenti:

http://msdn.microsoft.com/en-us/library/yd1hzczs.aspx

Il comportamento di ECMAScript e le espressioni regolari canoniche differisce in tre aree: sintassi classe di caratteri, di auto-riferimento acquisizione di gruppi e interpretazione ottale rispetto a backreference.

Non sembra che "l'ordine" sia interessato, ma potrebbero esserci altri problemi. I documenti fanno un buon lavoro di illustrare le differenze.

+1

L'ordine di elaborazione è diverso dall'ordine di precedenza dell'operatore. L'ordine di elaborazione descrive come viene eseguito (su ogni input) dopo che è stato analizzato. La precedenza degli operatori è una parte fondamentale di come viene analizzata. Sono d'accordo che "tutte le espressioni sono valutate da sinistra a destra" non è una risposta completa. Se lo fosse, '^ \ d' sarebbe una barra all'inizio della stringa (^ \\) seguita da un letterale' d'. –

1

Questo è stato chiesto molto tempo fa, ma non ha risposto.

L'accuratezza dell'operatore di regex .Net è definita nella parte inferiore della pagina Sintassi espressioni regolari 1.