我构建了一个正则表达式,用于从SQL Server中的限定列名中删除空格。在单个输入字符串中可能有一堆这样的例如,
SELECT *
FROM dbo.[bad column name]
UNION
SELECT *
FROM dbo.[bad column name2]
应该是
SELECT *
FROM dbo.[badcolumnname]
UNION
SELECT *
FROM dbo.[badcolumnname2]
以下是正则表达式搜索字符串:(\[\w*)( )([^\[\]]*?\])
正则表达式替换:$ 1 $ 3
但问题是需要多次调用才能替换列名中的所有空格。
即。
[bad column name]
变为
[badcolumn name]
然后最终得到所需的输出
[badcolumnname]
经过两次连续的更换操作
制作此正则表达式的好方法是什么,以便它不必迭代?
答案 0 :(得分:1)
如果您至少知道标签中的最大字数,则可以使用此替换
\[((\w+)\s?)?((\w+)\s?)?((\w+)\s?)?((\w+)\s?)?((\w+)\s?)?\]
[$2$4$6$8$10]
https://regex101.com/r/uB5fQ4/2
如果你不关心正则表达式的长度,你可以使用非捕获组来避免捕获你不需要的组,这样你就不必跳过它们。
\[(?:(\w+)\s?)?(?:(\w+)\s?)?(?:(\w+)\s?)?(?:(\w+)\s?)?(?:(\w+)\s?)?\]
[$1$2$3$4$5]
https://regex101.com/r/wC1iX2/1
否则你应该使用解析器而不是正则表达式,因为即使每次找到匹配时都使用全局修饰符/ g,也会覆盖捕获组。
你可以在这里看到这种情况:https://regex101.com/r/iN2rD4/2
这是使用javascript实现所需结果的一种方法:
https://jsfiddle.net/yosefh/0ohrno4L/1/
<body>
<div id="result" ></div>
<script>
var str = '[bad column name]';
var result = str.replace(/\s+/g,'');
document.getElementById("result").innerHTML = result;
</script>
</body>
和PHP
$str = '[bad column name]';
$result = preg_replace('/\s+/', '', $str);
您可以在此处查看解析选项
How do I regex match with grouping with unknown number of groups
在这里:
How to capture an arbitrary number of groups in JavaScript Regexp?
在这里试用正则表达式: https://regex101.com/