MS Access SQL:使用update and replace以单个空格删除多个空格

MS Access SQL:使用update and replace以单个空格删除多个空格,sql,ms-access,spaces,Sql,Ms Access,Spaces,在MS Access中,我尝试使用: UPDATE Table SET FieldName= REPLACE(FieldName, '\s+', '\s'); 从字段中删除多个空格,但不起作用。如问题注释中所述,Replace()函数不支持正则表达式。但是,您可以使用以下VBA代码实现您的目标: 选项比较数据库 选项显式 子移除多个空间() Dim cdb作为DAO.Database 设置cdb=CurrentDb 执行以下操作:“字段名”、“表名”、“类似于“**”的字段名”>0 cdb.E

在MS Access中,我尝试使用:

UPDATE Table SET FieldName= REPLACE(FieldName, '\s+', '\s');

从字段中删除多个空格,但不起作用。

如问题注释中所述,
Replace()
函数不支持正则表达式。但是,您可以使用以下VBA代码实现您的目标:

选项比较数据库
选项显式
子移除多个空间()
Dim cdb作为DAO.Database
设置cdb=CurrentDb
执行以下操作:“字段名”、“表名”、“类似于“**”的字段名”>0
cdb.Execute“UPDATE TableName SET FieldName=Replace(FieldName,”“,”“)”
环
设置cdb=无
端接头
编辑回复:评论

或者,您可以使用以下代码,该代码使用正则表达式查找替换候选项:

选项比较数据库
选项显式
公共函数RegexReplace(_
原文作为变体_
regexpatern作为字符串_
将文本替换为字符串_
可选GlobalReplace As Boolean=True)作为变量
Dim rtn作为变体
作为对象“RegExp”的Dim objRegExp
rtn=原始文本
如果不是IsNull(rtn),则
设置objRegExp=CreateObject(“VBScript.RegExp”)
objRegExp.Pattern=regexpatern
objRegExp.Global=GlobalReplace
rtn=objRegExp.Replace(原始文本,替换文本)
设置objRegExp=Nothing
如果结束
RegexReplace=rtn
端函数
用法示例:

RegexReplace(“这是一个测试。”,“\s+”,“”)
返回

这是一个测试。
您可以在如下查询中使用它:

updatetablename SET FieldName=RegexReplace(字段名“\s+”,”)

此功能可删除多个空格以及制表符、新行符号等

Public Function removeObsoleteWhiteSpace(FromString As Variant) As Variant
  If IsNull(FromString) Then 'handle Null values
    removeObsoleteWhiteSpace = Null
    Exit Function
  End If
  Dim strTemp As String
  strTemp = Replace(FromString, vbCr, " ")
  strTemp = Replace(strTemp, vbLf, " ")
  strTemp = Replace(strTemp, vbTab, " ")
  strTemp = Replace(strTemp, vbVerticalTab, " ")
  strTemp = Replace(strTemp, vbBack, " ")
  strTemp = Replace(strTemp, vbNullChar, " ")
  While InStr(strTemp, "  ") > 0
    strTemp = Replace(strTemp, "  ", " ")
  Wend
  strTemp = Trim(strTemp)
  removeObsoleteWhiteSpace = strTemp
End Function

发生了什么事?它怎么不起作用?首先在select中执行replace,以在不损害数据的情况下找到它。执行后,空格仍然存在。Access中没有内置的正则表达式支持,
replace()
使用简单字符串。请参阅您的代码是否替换了两个以上的空格?我在vba代码中看不到正则表达式。@Cricket是的,
While
循环一直在寻找两个连续空格的序列,并用单个空格替换它们。它一直这样做,直到所有的双空格都消失为止(并且
DCount()
返回零)。是否可以改用正则表达式?如果我在子表达式中使用RegexReplace,我会发现表达式中没有定义RegexReplace。我是否以任何方式定义了它?@Cricket只需在查询本身中使用
RegexReplace()
,而不是您最初尝试使用的(内置)
Replace()
函数。还要注意,
RegexReplace()
函数必须位于标准VBA模块中,而不是窗体或报表的类模块中。