JavaScript的负面预测并不像预期的那样起作用?

时间:2014-11-18 09:56:24

标签: javascript regex

我在textarea中有一些数据:

(是的,它是多线)

"@ObjectTypeID", DbType.In
"@ObjectID", DbType.Int32,
"@ClaimReasonID", DbType.I
"@ClaimReasonDetails", DbTy
"@AccidendDate", DbType.Da
"@AccidendPlaceID", DbType
"@AccidendPlaceDetails", Db
"@TypeOfMedicalTreatment", 
"@MedicalTreatmentDate", Db
"@CreatedBy", DbType.Int32
"@Member_ID", DbType.Strin
.ExecuteScalar(command).ToS

在每一行中 - 我想删除这些部分:(从"(包括)到行尾:)

视觉上:(我只抽样4次)

enter image description here

我设法做到了这一点:

   value=value.replace(/\"[a-z,. ]+(?!.*\")/gi,'') 

这意味着:搜索其后有章程的第一个",其中没有未来"

这将产生所需的结果:

"@ObjectTypeID
"@ObjectID32,
"@ClaimReasonID
"@ClaimReasonDetails
"@AccidendDate
"@AccidendPlaceID
"@AccidendPlaceDetails
"@TypeOfMedicalTreatment
"@MedicalTreatmentDate
"@CreatedBy32
"@Member_ID
.ExecuteScalar(command).ToS

问题:

我理解为什么它有效,但我不明白为什么以下不起作用:

value=value.replace(/\".+(?!.*\")/gi,'')

http://jsbin.com/fanep/4/edit

我的意思是:它假设要搜索"之后有包机的地方,不会有未来" ....

我错过了什么?我真的很想宣布[a-z,. ]

4 个答案:

答案 0 :(得分:2)

+贪婪。因为"整个事情"符合您的&#34规则;在"之后不得有",它会随之而来。

你的第一个正则表达式起作用的原因是你通过明确地将某些字符列入白名单来禁止大多数字符。

要解决此问题,请尝试在?之后添加+ - 这会使其变得懒惰,尽可能少地匹配,同时仍然符合规则。


此外,您正在搜索要保留的内容...然后将其删除。

请改为尝试:

val = val.replace(/"[^"]*(?=[\r\n]|$)/g,'');

这将删除从最后"到行尾(或输入结尾)的所有内容。

答案 1 :(得分:2)

value=value.replace(/\"[a-z,. ]+(?!.*\")/gi,'') 
     

表示:搜索其后有章程的第一个",其中没有未来"

准确地说:它与第一个"匹配,后面有一些字符[a-z,. ],然后不是(在任何距离),后跟另一个"

  

我不明白为什么以下不起作用:

value=value.replace(/\".+(?!.*\")/gi,'')

您已删除了字符类的限制。 .+现在将匹配任何字符,包括引号。无论是否贪婪,它现在都会找到第一个",后跟一定数量的任何字符(包括其他引号),后面不再有引号 - 即它就足够了如果.+匹配到最后一个引用。

  

我真的很想宣布[a-z,. ]

您可以使用除引号之外的所有字符的类:[^"]。实际上,我认为以下无前瞻版本更符合您的意图:

value = value.replace(/"[^"\n\r]*/gi, '');

答案 2 :(得分:1)

无效的工作失败,因为.+ 贪婪。它尽可能地吃掉它。 (视觉工具可以在这里提供帮助,例如:http://regex101.com/r/eJ5kJ2/1)我们可以通过将.+置于捕获组中来更清楚[a-z,. ]+匹配过多:http://regex101.com/r/qF7nR9/1其中告诉我们:

enter image description here

工作(http://regex101.com/r/kR8vL6/1)的那个中,您已将其更改为.,这意味着"一个或多个a到z ,逗号,句号或空格" (请注意,@只有一段时间,不是一个通配符)。这有点受限(特别是,它不包括")。


附注:没有必要使用反斜杠转义",{{1}}不是正则表达式中的特殊字符。

答案 3 :(得分:1)

为什么下面的正则表达式不起作用?

\".+(?!.*\")

答案:

\"与第一个"匹配,以下.+将贪婪地匹配到最后一个字符。因为一行中的最后一个字符后面跟不是任何字符零次或多次加上\,所以上面的正则表达式无疑会匹配整行。

对于您的情况,您可以简单地使用以下正则表达式从第二个"到行锚点的末尾进行匹配。

\"[^"\n]*$

DEMO