正则表达式在PHP中工作,在Erlang中不工作。为什么?
我试图将用PHP编写的url解析函数重写为Erlang。我发现这些正则表达式在Erlang中不起作用,但在PHP代码中可以很好地工作。你能告诉我为什么以及如何让它与Erlang一起工作吗正则表达式在PHP中工作,在Erlang中不工作。为什么?,php,regex,erlang,Php,Regex,Erlang,我试图将用PHP编写的url解析函数重写为Erlang。我发现这些正则表达式在Erlang中不起作用,但在PHP代码中可以很好地工作。你能告诉我为什么以及如何让它与Erlang一起工作吗 Loose = "^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/\/?)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((?:\/(\w:))?(\/(?:[^?#](?![^?#\/]*\.[^?#\/.
Loose = "^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/\/?)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((?:\/(\w:))?(\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)".
re:compile( Loose ).
{error,{"nothing to repeat",166}}
Strict = "^(?:([^:\/?#]+):)?(?:\/\/\/?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?(((?:\/(\w:))?((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)".
re:compile( Strict ).
{error,{"nothing to repeat",114}}
但这段代码运行良好:
$url = "http://gazeta.ru/";
$loose = '/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/\/?)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((?:\/(\w:))?(\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/';
preg_match($loose, $url, $match);
var_dump( $match );
字符\在Erlang的字符串中是特殊的。还有一些特殊字符前面必须加反斜杠,包括双引号和反斜杠。标记特殊字符的技术称为转义,反斜杠本身称为转义字符。因此\后面必须跟另一个字符。例如,如果要在字符串中包含字符“\”和一个反斜杠,则应写入\:
CorrectString = "C:\\windows" %% Correct
WrongString = "C:\windows" %% Wrong
因此,您必须将regexp中的所有单反斜杠更改为双反斜杠。以下是erlang shell中的一个示例:
3> Loose = "^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/\\/?)?((?:(([^:@]*):?([^:@]*))?@)?([^:\\/?#]*)(?::(\\d*))?)(((?:\\/(\\w:))?(\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)".
4> re:compile(Loose).
{ok,{re_pattern,14,0,
<<69,82,67,80,147,2,0,0,16,0,0,0,1,0,0,0,14,0,0,0,0,0,0,
...>>}}
字符\在Erlang的字符串中是特殊的。还有一些特殊字符前面必须加反斜杠,包括双引号和反斜杠。标记特殊字符的技术称为转义,反斜杠本身称为转义字符。因此\后面必须跟另一个字符。例如,如果要在字符串中包含字符“\”和一个反斜杠,则应写入\:
CorrectString = "C:\\windows" %% Correct
WrongString = "C:\windows" %% Wrong
因此,您必须将regexp中的所有单反斜杠更改为双反斜杠。以下是erlang shell中的一个示例:
3> Loose = "^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/\\/?)?((?:(([^:@]*):?([^:@]*))?@)?([^:\\/?#]*)(?::(\\d*))?)(((?:\\/(\\w:))?(\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)".
4> re:compile(Loose).
{ok,{re_pattern,14,0,
<<69,82,67,80,147,2,0,0,16,0,0,0,1,0,0,0,14,0,0,0,0,0,0,
...>>}}
天啊。我忘记了:谢谢你的帮助天啊。我忘记了:谢谢你的帮助