JavaScript';s的消极前瞻不';你不能按预期工作吗?
我在JavaScript';s的消极前瞻不';你不能按预期工作吗?,javascript,regex,Javascript,Regex,我在文本区域中有一些数据: (是的,它是多行的) 在每一行中-我想删除这些部分:(从“(include)到行末): 视觉上:(我只采样了4个) 我设法做到了这一点: value=value.replace(/\"[a-z,. ]+(?!.*\")/gi,'') 这意味着:搜索第一个“后有特许权的地方,它没有未来的” 这将产生所需的结果: "@ObjectTypeID "@ObjectID32, "@ClaimReasonID "@ClaimReasonDetails "@Accide
文本区域中有一些数据
:
(是的,它是多行的)
在每一行中-我想删除这些部分:(从“
(include)到行末):
视觉上:(我只采样了4个)
我设法做到了这一点:
value=value.replace(/\"[a-z,. ]+(?!.*\")/gi,'')
这意味着:搜索第一个“
后有特许权的地方,它没有未来的”
这将产生所需的结果:
"@ObjectTypeID
"@ObjectID32,
"@ClaimReasonID
"@ClaimReasonDetails
"@AccidendDate
"@AccidendPlaceID
"@AccidendPlaceDetails
"@TypeOfMedicalTreatment
"@MedicalTreatmentDate
"@CreatedBy32
"@Member_ID
.ExecuteScalar(command).ToS
问题:
我理解它为什么起作用,但我不理解为什么以下各项不起作用:
value=value。替换(/\“+(?!.\”)/gi')
我的意思是:它假设搜索“
后面有章程的地方,而后面没有未来的”
我遗漏了什么?我真的很讨厌声明
[a-z,.]
+
是贪婪的。因为“整件事”符合你的规则“以后不能有”
,这就顺其自然了
第一个正则表达式工作的原因是,通过显式地将某些字符列为白名单来禁止大多数字符
要修复此问题,请尝试在+
之后添加?
——这将使其变为惰性,在满足规则的情况下尽可能少地匹配
此外,你正在搜索你想要保留的东西。。。然后删除它 请尝试以下方法:
val = val.replace(/"[^"]*(?=[\r\n]|$)/g,'');
这将删除从最后一个
“
到行尾(或输入端)的所有内容。由于+
贪婪,无法工作的内容将失败。它会耗尽所有可能的内容。(可视化工具可在此提供帮助,例如此工具:)通过将+
放入捕获组,我们可以更清楚地看到它匹配得太多:这表明:
在你的一个确实有效的()中,你已经将其改为[a-z,.]+
,意思是“一个或多个a到z、逗号、句点或空格”(注意,
只有一个句点,不是通配符)。这是非常有限的(特别是,它不包括@
)
旁注:不需要用反斜杠转义
“
,”
在正则表达式中不是特殊字符
意思是:搜索第一个“
后有特许权的位置,该位置没有未来的”
确切地说:它匹配第一个“
,该字符后面有一些字符[a-z,.]
,之后不(在任何距离上)跟另一个”
我不明白为什么以下情况不起作用:
value=value.replace(/\".+(?!.*\")/gi,'')
您已经删除了字符类的限制。+
现在将匹配任何字符,包括引号。无论是否贪婪,它现在都将找到第一个“
,后面跟任意数量的字符(包括其他引号)后面不再加引号-即,如果+
匹配到最后一个引号就足够了
我真的很讨厌声明[a-z,.]
您可以只使用除引号外的所有字符的类:[^”]
。事实上,我认为下面的无前瞻性版本更符合您的意图:
value = value.replace(/"[^"\n\r]*/gi, '');
为什么下面的正则表达式不起作用
\".+(?!.*\")
答复:
\“
匹配第一个”
,下面的+
将贪婪地匹配到最后一个字符。因为行中的最后一个字符后面没有任何字符零次或多次加上\
,所以上面的正则表达式将毫无疑问地匹配整行
对于您的情况,您可以简单地使用下面的正则表达式来匹配从第二个“
到线锚的末端
\"[^"\n]*$
您的预期输出是什么?@AvinashRaj我已经展示了:-)“事实上,我认为下面的前瞻免费版本更符合您的意图”+1
\".+(?!.*\")
\"[^"\n]*$