2011-04-25 357 views
0

我有一个像这样的字符串:在一个字符串替换字符与正则表达式

PREFIX-('STRING WITH SPACES TO REPLACE') 

,我需要这样的:

PREFIX-('STRING_WITH_SPACES_TO_REPLACE') 

我用记事本+ +的正则表达式搜索和替换,但我舒服其他编辑器能够正则表达式替换可以做到这一点。

我使用:

PREFIX-\('(.*)(\s)(.*)'\) 

搜索和

PREFIX-('\1_\3') 

用于替换 但是,它取代了字符串只有一个空格。

+0

是否有任何理由,你不能只是做一个标准的查找/替换上空间? – 2011-04-25 16:19:12

+0

这是因为我只需要替换'PREFIX-('... this ...')'中的空格。文本文件中的其他空格必须保持不变。 – Mike 2011-04-25 16:21:10

+1

不知道如何在Notepad ++中修复它,但是它被破坏的原因是每行只匹配一次。也许可以通过'sed'运行它并执行“全局”(即每行多次)替换? – drysdam 2011-04-25 16:21:14

回答

1

Notepad ++中的正则表达式搜索功能非常非常弱。我可以看到在NPP中执行此操作的唯一方法是手动选择要处理的文本部分,然后在选中In selection框的情况下执行标准查找/替换。

或者,您可以通过外部脚本运行文档,或者您可以获得更好的编辑器。 EditPad Pro是我在编辑器中见过的最好的正则表达式支持。这不是免费的,但值得付费。在EPP所有我需要做的就是这一点:

搜索:((?:PREFIX-\('|\G)[^\s']+)\s+

取代:$1_


编辑:\G当先前的比赛结束的位置,或者如果输入的开头匹配没有以前的比赛。换句话说,第一次应用正则表达式时,\G的行为如\A。您可以防止通过添加一个负先行,就像这样:

((?:PREFIX-\('|(?!\A)\G)[^\s']+)\s+ 

如果你想阻止对手在文本的最开始,无论是什么开头,你可以组外移动先行:

(?!\A)((?:PREFIX-\('|\G)[^\s']+)\s+ 

而且,万一你想知道,一个回顾后会很好的工作作为一个前瞻:

((?:PREFIX-\('|(?<!\A)\G)[^\s']+)\s+ 
+0

WOW。EPP's正则表达式引擎踢了一些严重的屁股!我不完全理解你的正则表达式,但它的工作原理。谢谢! – Mike 2011-04-28 22:28:21

+0

您的正则表达式匹配的接缝 '<?php defined('_EXEC')or die('Nope'); ?>' – Mike 2011-04-28 22:54:14

+0

不管怎样,它匹配'<?php'。请参阅我的编辑以获取解释。 – 2011-04-29 04:17:53

0

你必须保持匹配从字符串的开始,直到你不能再匹配。

找到/(PREFIX-\('[^\s']*)\s([^']*'\))/

更换$1_$2

,如:while (/(PREFIX-\('[^\s']*)\s([^']*'\))/$1_$2/) {}

+0

哪些文本编辑器支持while循环?我必须在像notepad ++这样的文本编辑器中执行此操作。 – Mike 2011-04-25 18:03:42

+0

@Mike - 那么你可以做的最好的办法是在全局中找到'/([^ \ s'] *)\ s(?= [^'] *'\))/'replace' $ 1_'。因为你只能知道在最后一场比赛前的位置。 – sln 2011-04-25 18:39:47

0

如何使用更换所有约20倍?或者直到您确定没有字符串包含更多空格

+0

我实际上不得不在'PREFIX - (''部分,所以重复不会帮助这里。 – Mike 2011-04-25 18:18:01

0

由于正则表达式的性质,无法通过一般正则表达式在一个步骤中执行此操作。

但是,如果我是你的地方,我在几个步骤做这样的替代对象:

  1. 发现这种模式并用特殊字符标记它们 (如使用@STRING WITH SPACES TO [email protected]
  2. 更换STRING WITH SPACES TO REPLACE更换@([^@\s]*)\s@\1_服务器倍。
  3. 删除标记!
0

我学了一点正则表达式Notepad ++中的工具,因为我不知道它们的可能性。

我得出结论,他们没有足够的力量做你想做的事。

您有义务学习和使用具有真正的正则表达式能力的编程语言。有一些他们。 Personnaly,我使​​用Python。这将需要1万做你想要做什么用

+0

我使用PHP,我知道它可以通过编码完成的东西。 – Mike 2011-04-25 19:22:22

+0

@Mike所以,如果它是不可能做到这一点一个编辑器,你打算做什么? – eyquem 2011-04-25 19:45:05

+0

猜想我会用上面的一些正则表达式魔法创建一个小的phing脚本 – Mike 2011-04-28 23:31:58

0

你必须运行的每个空间替换几次,但这个表达式将工作

/(?<=PREFIX-\(')([^\s]+)\s+/g 

替换为

\1_ or $1_ 

看到它在工作http://refiddle.com/10z

+0

谢谢,但是这样不断的替换,并且它不会在结束括号之后结束 – Mike 2011-04-28 23:24:49