2017-04-25 75 views
1

我有在細胞以下字符串:刪除 u00A0字符

enter image description here

我要拆分的字符串轉換成僅包含文本詞(如「CRMNegocios」)的陣列沒有任何子彈,新的生產線,等等

要做到這一點,我已經寫了下面的代碼:

Sub Button1_Click() 

    Dim stringsToCheck As Variant 
    Dim element As Variant 
    Dim stripped As String 

    'Split cell value per vbLf 
    stringsToCheck = Split(Cells(42, 10).Value, vbLf) 
    MsgBox ("Total length of stringsToCheck is " & CStr(UBound(stringsToCheck))) 

    'Remove special characters - for testing only, it will set the cell with the last value of the array 
    For Each element In stringsToCheck 
     stripped = GetStrippedText(CStr(element)) 
     Cells(42, 15) = stripped 
    Next element 


End Sub 

Private Function GetStrippedText(txt As String) As String 
    Dim regEx As Object 

    Set regEx = CreateObject("vbscript.regexp") 

    '\u0000-\u007F is for other special characters 
    regEx.Pattern = "[\u25A0\u00A0\u0000-\u007F]" 
    GetStrippedText = regEx.Replace(txt, "") 

End Function 

子彈被刪除(這是\u25A0)的前pected,但我仍然留下的文字字前\u00A0字符:

enter image description here

我檢查和regex is matching,爲什麼它沒有在VBA刪除?

正如在評論中提到,在單元格原文:

文本測試細胞,之後
■         CRMNegocios 
■         GestiondeProyectos 
■         Emblue 
■         Videoconferencia 

代碼運行:

Videoconferencia

+0

對不起,你是否試圖從字符串的開頭刪除這些非字字符?我想你可能只是使用'regEx.Pattern =「^ \ W +」'或者用你的方法'regEx.Pattern =「^ [\ u25A0 \ u00A0 \ s] +」'。請注意,'\ u0000- \ u007F'定義了一個ASCII表格範圍,如果用它來替換,它將從字符串 –

+0

中刪除所有ASCII字母,數字,所有ASCII符號。謝謝@WiktorStribiżew,這確實有效。你能解釋一下[在答案中,所以我可以接受:)]爲什麼我的初始方法在VBA中不匹配?並設置'regEx.Global = True'導致一切都被替換。雖然它在[here](https:// regex101)中似乎是正確的。com/r/KP1tF6/1) - 它應該只是找到特殊字符並刪除它們,爲什麼我必須指定字符串開頭的'^',如果我想要刪除任何地方的特殊字符,會發生什麼?字符串? –

+0

我在下面發佈了一個答案。 –

回答

1

我建議使用"^[\u25A0\u00A0\s]+"刪除所有的標準空白,不間斷空間和子彈點。它匹配:

  • ^ - 字符串的開始
  • [\u25A0\u00A0\s]+ - 1次或多次出現的:
    • \u25A0 - 要點
    • \u00A0 - 不間斷空格
    • \s - [ \r\t\n\f]空白

您的正則表達式不是全局匹配的,所以在匹配並刪除第一個項目符號點之後,它停止了。然後,您的正則表達式還包含定義所有ASCII字符的u0000-\u007F範圍。如果按原樣使用,則使用Replace,它會從字符串中刪除所有ASCII字母,數字和所有ASCII符號。這就是爲什麼當您添加.Global = True以匹配所有匹配項時刪除了您的文本。

請注意,如果你處理ASCII文本只,你需要從一個字符串的開始刪除任何非單詞字符,你可以使用regEx.Pattern = "^\W+"(無需設置.Global)。