用于删除两端的非 ASCII 字符

By simon at 2019-05-18 • 0人收藏 • 22人看过

我必须循环多次使用这个代码,有更好的方法吗?

项目'! @ # $abc-123-4; 5. Def)(* & ^ ;  n'

'! @ # $abc-123-4; 5. Def)(* & ^ ;  n'

'! @ # $abc-123-4; 5. Def)(* & ^ ;  n'

我的这个不管用

项目 re.sub ('^  w |  w $',",item)

期待

Abc-123-4; 5. Def

最终的目标是保持只删除任何不[ a-zA-Z0-9]同时在两端保持任何焦。 第一个和最后一个字母是在课堂上[ a-zA-Z0-9]

3 个回复 | 最后更新于 2019-05-18
2019-05-18   #1

这个表达式并不是从左边开始,如果你想要的字符与你问题中的例子相似,那么它可能会更快

([ a-z0-9;. -]+)(. *)

我假设您可能只想过滤输入字符串左右两部分中的特殊字符。

您可以向该表达式添加更多的字符和边界,如果愿意,甚至可以将其更改为更简单、更快的表达式。

正则描述图

这个图表显示了表达式是如何工作的,您可以在这个图表中可视化其他表达式链接:

如果你想在右边添加边界,你可以这样做:

([ a-z0-9;. -]+)(. *)$

或者你甚至可以列出你的特殊字符,在左边和右边的一个捕获组。

测试

Const regex / ([ a-z0-9;. -]+)(. *) $/ gm; const str'! @ #  abc-123-4; 5. (* & ^ ;  n'; let m; while ((m regeexec.exec (str))) ! 如果(m.index regex.lastIndex){ regex.lastIndex + ; } / / / 结果可以通过'm'-variable 访问,则需要使用 null){ / / / 来避免零宽度匹配的无限循环。 Foreach (((match,groupIndex)){ console.log ('Found match,group ${ groupIndex } : ${ match }'; }) ; }) ;

表现测试

这个 JavaScript 代码片段使用简单的100万次显示了该表达式的性能为了循环。

1000000; const start Date.now () ; for (var i repeat; i 0; i -){ const string'! @ #  abc-123-4; 5. )(* & ^ ;  n'; const regex / (! @ # $)(* & ^ ; +)([ a-z0-9;. -]+)(. *) $/ gm; var match string.replace (regex,"$2") ; } const end Date.now ()-start; console.log ("YAAAY! "+ match +""is a match") ; console.log (end / 1000 +"是"+ repeat +"times benchmark test"的运行时 ;

Python 测试

# coding utf8 # 上面的标记为这个文档定义了编码,并用于 Python 2.x 兼容性导入 re regex r"([ a-z0-9; ; 。 -]+)(. *) $"test str"! @ # $abc-123-4; 5. Def)(* & ^ ;  n"为 matchNum 匹配 re.finditer (regex,test str,re.MULTILINE) ,在 enumerate 中匹配(matches,start 1) : print ("Match { matchNum } was found at { start }-{ end } : { Match }"。 格式(matchNum matchNum,start match.start () ,end match.end () ,match match.Group ())))用于 groupNum 的范围(0,len (match.groups ())) : groupNum groupNum + 1 print ("Group { groupNum } found at { start }-{ end } : { Group }"。 格式(groupNum groupNum,start match.start (groupNum) ,end match.end (groupNum) ,group match.group (groupNum))) # 注意: 为了 Python 2.7兼容性,使用 ur""作为 regex 和 u 的前缀以作为测试字符串和替换的前缀。

输出

匹配1发现于4-27: abc-123-4; 5。 4-19: abc-123-4; 5. Def Group 2 found at 19-27:)(* & ^ ;  n
2019-05-18   #2

你可以通过使用克拉来实现这一点^字符集开头的字符,用于对其内容进行否定。[ ^ a-zA-Z0-9]可以匹配任何不是字母或数字的东西。

^ [ ^ a-zA-Z0-9] + | [ ^ a-zA-Z0-9] + $
2019-05-18   #3

修剪非字字符(上层W) ,但也要添加属于字符[ A-Za-z0-9]你可以将下划线添加到字符类和... 一起W.

^ [ w ] + | [ w ] + $

请参阅 regex101的 demo. 这与@caustins 的回答非常相似。

登录后方可回帖

Loading...