2010-07-22 57 views
1

帮助我需要摆脱尾随重复non_alphanumeric符号像需要在PostgreSQL REGEXP_REPLACE

"thanks ! !!!!!!!""thanks !"

如果这些不同的符号,然后它们将被忽略。

我很新的正则表达式, 所以我想出了

regexp_replace('Thanks . . . . ', '((\\W)\\s*)(\\2\\s*)+', '\\2') 

尝试一下。

但是,我认识到'谢谢'后导致一些问题的尾部空间。我会回来"thanks "而不是"thanks ."这有点奇怪,因为我使用了一个在线正则表达式工具,并且第一个空白不匹配。谁能帮忙?

注:我没有插入双反斜杠。

+0

你想摆脱所有非字母数字符号的除了最后一个(标点符号)或实际干掉每一个的他们?或者,也许摆脱重复的标点符号?我不确定我明白你想要哪一个。 – NorthGuard 2010-07-22 17:05:53

+0

实际上我想减少2个或更多个重复的相似符号(有或没有空白)为1,例如“......”。只是“。”诸如“#%@”之类的内容将保持不变。 – goh 2010-07-22 17:08:18

+0

空间应该如何处理(因为它不是字母数字)?如果你有字符串''谢谢!!!! ???''你想要''谢谢!?“或''谢谢!?''?编辑:在不好的地方换行符,基本上如果原始字符串在重复的不同符号之间有空格。 – NorthGuard 2010-07-22 17:37:06

回答

2

更换

(\W)(\s*\1)+ 

\1 

我不知道PostgreSQL的,但是从你的榜样,我猜:

regexp_replace('Thanks . . . . ', '(\\W)(\\s*\\1)+', '\\1') 

这也将取代多个领先有一个空间的空间。如果您不希望那样(即,如果您希望领先空间完全被留下),则使用

([^\s\w])(\s*\1)+ // '([^\\s\\w])(\\s*\\1)+' 

代替。

+0

这就是我也会这样做的(除了我会在末尾加上另一个'\ s *'来处理尾部空格)。但是OP的正则表达式应该可以工作 - 在“Tcl ARE/PostgreSQL”模式下,它在RegexBuddy中运行良好。 – 2010-07-22 20:29:18

+0

@ Alan,@ Tim,非常感谢! – goh 2010-07-23 02:56:11

0

尝试这样的:

select regexp_replace('Thanks ! !!!!!!!!', '(\\s*)((\\W)\\s*)(\\2\\s*)+', '\\1\\2'); 

结果:

Thanks !