我有以下正则表达式:
^(?:(?!<(\w+)(\s+(\w+)\s*\=\s*(\'|")(.*?)\\4\s*)*\s*>).)*$
我有文本框,用户可以在其中键入JavaScript代码,因此正则表达式应匹配以下内容:
if ( i < html > 0 ) || ( j > 10 )
并且它有效,但仅适用于单行,但必须适用于多行
顺便说一句。我在此页面上测试正则表达式:http://www.zytrax.com/tech/web/regex.htm#experiment
答案 0 :(得分:1)
多行输入失败的原因是默认情况下点(.
)与换行符不匹配。您可以通过将(?s)
添加到正则表达式的前面以将其置于单线模式(在某些风格中也称为DOTALL模式,因为它使点能够匹配包括换行符的所有内容来修复它)。
其他响应者提到的多线模式可能与您的情况无关。它的作用是允许^
和$
锚点匹配各行的开头和结尾以及整个字符串的开头和结尾。
你说你在ASP.NET RegularExpressionValidator中使用它,这带来了另一个潜在的问题。如果验证器设置为在客户端和服务器上进行验证,那么它将是执行工作的JavaScript正则表达式,而不是.NET。 JavaScript不支持Singleline / DOTALL模式,因此您需要将正则表达式中的点替换为与所有字符匹配的其他内容;大多数人使用[\s\S]
(任何空格字符或任何不空格的字符)。
这是由此产生的正则表达式,包括引用属性值的更强大的习惯用法:
^(?:(?!<\w+(?:\s+\w+\s*\=\s*(['"])(?:(?!\1).)*\1)*\s*>)[\s\S])*$
答案 1 :(得分:0)
如果它是javaScript,你将在你的正则表达式中使用m多线修改器:
你可以测试它在这里工作: http://regexpal.com/
答案 2 :(得分:0)
所有正则表达式引擎都有匹配multi-line的选项。既然你的问题没有提到你正在使用哪种引擎,那么就不容易为你提供进一步的帮助。