RegEx从SQL Server

时间:2016-06-07 21:50:56

标签: sql-server regex

我构建了一个正则表达式,用于从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]

经过两次连续的更换操作

制作此正则表达式的好方法是什么,以便它不必迭代?

1 个答案:

答案 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/