除了正则表达式组之外,如何替换所有内容?

3
我得到了一个任务,需要花费很长时间才能完成。
图片已经说的很清楚:
这是我拥有的(100次):
我只需要提取这个值:
我用这个正则表达式实现了它:
DbCommand.*?\("(.*?)"\);
如你所见,它确实起作用:
并且在replace函数(替换为$1)之后,我会得到纯净的值:
但问题在于,我只需要纯粹的值,而不是剩下的未匹配组:
问题:换句话说:
我该怎么得到纯净的结果呢?
Eservices_Claims_Get_Pending_Claims_List
Eservices_Claims_Get_Pending_Claims_Step1 

这里是我在在线正则表达式测试工具上的代码

  • 有没有办法替换掉“除匹配组外的所有内容”?

p.s. 我知道还有其他方法可以实现,但我更喜欢使用正则表达式解决方案(这也将帮助我更好地理解正则表达式)


RegexBuddy可以做到这一点...同时在Visual Studio中运行它会给你想要的结果...你的链接无效,所以我不能提供更多帮助。 - abc123
@abc123请阅读我的PS。 - Royi Namir
我是指使用正则表达式... - abc123
1
可能是使用正则表达式进行反向匹配的重复问题。 - abc123
@abc123,Visual Studio 的正则表达式搜索引擎比 JS 正则表达式引擎差得多。供您参考。 - Royi Namir
显示剩余2条评论
4个回答

2
很遗憾,JavaScript 不理解 lookbehind。如果它理解的话,你可以改变你的正则表达式来匹配 DbCommand.*?\(" 前面(lookbehind)的 .*?,以及后面(lookahead)的 "\);
由于这个方法不可行,我认为最简洁的解决方案是进行两次匹配:
// you probably want to build the regexps dynamically
var regexG = /DbCommand.*?\("(.*?)"\);/g;
var regex  = /DbCommand.*?\("(.*?)"\);/;
var matches = str.match(regexG).map(function(item){ return item.match(regex)[1] });

console.log(matches); 
// ["Eservices_Claims_Get_Pending_Claims_List", "Eservices_Claims_Get_Pending_Claims_Step1"]

演示:http://jsbin.com/aqaBobOP/2/edit

1
您可以使用以下内容(不使用忽略大小写和多行选项,进行全局搜索):
pattern: (?:[^D]+|\BD|D(?!bCommand ))+|DbCommand [^"]+"([^"]+)
replace: $1\n

1

您应该能够全局替换:

public static DataTable.*?{.*?DbCommand.*?\("(.*?)"\);.*?}

我所做的只是改变了它以匹配整个块,包括使用一堆.*?的函数定义。

注意:确保您的正则表达式设置是使点(.)匹配所有字符,包括换行符。


实际上,如果您想关闭所有空格,可以在前面加上\s*并替换为$1\n
\s*public static DataTable.*?{.*?DbCommand.*?\("(.*?)"\);.*?}
使用您的测试用例:http://regexr.com?37ibi

因此,它应该是 [\s\S] - Royi Namir
@RoyiNamir 当然可以,或者使用“dotall”选项(在JavaScript中,我相信这是s标志)。 - lc.
我的思路是先将组找出来,然后排除掉除了它之外的所有内容...(不用搜索被排除的内容) - Royi Namir
在线工具中有一个名为“dotall”的复选框。 - Royi Namir

0

尝试使用以下表达式替换整个文档:

^(?: |\t)*(?:(?!DbCommand).)*$

然后你只会留下以字符串DbCommand开头的行。

您可以通过全局替换\r?\n\s*\n来删除它们之间的空格。

这是一个工作示例:http://regexr.com?37ic4


这将不会产生纯净的结果。 - Royi Namir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接