2011-12-14 2 views
2

이 문자열은 "1X214X942,0SX"입니다. 여기서 각 X는 ASCII 코드 160이있는 "비 분리 공백"(정확히는 공백 임)을 나타내며 S는 공백 문자를 나타냅니다.VBA 6 : 복잡한 문자열을 인식하지 못하는 정규식

(\d{1,3}\s(\d{3}\s)*\d{3}(\,\d{1,3})?|\d{1,3}\,\d{1,3}) 

을하지만 그것은 작동하지 않습니다,이 공백이 인식되지 않는 및 표현은 942,0을 잡는다 :

나는이 정규식으로 인식하려합니다.

RegExr이 전체 문자열을 잡을 수 있는지 확인하려고했는데 (http://gskinner.com/RegExr/?2v8ic) 내 VBA에 문제가 있습니까?

알려 주시기 바랍니다. \sVBScript.RegExp 구현의 비 분리 공백을 포함하지 않는,

Sub ChangeNumberFromFRformatToENformat() 

Dim SectionText As String 
Dim RegEx As Object, RegC As Object, RegM As Object 
Dim i As Integer 


Set RegEx = CreateObject("vbscript.regexp") 
With RegEx 
    .Global = True 
    .MultiLine = False 
    .Pattern = "(\d{1,3}\s(\d{3}\s)*\d{3}(\,\d{1,3})?|\d{1,3}\,\d{1,3})" 
End With 

For i = 1 To ActiveDocument.Sections.Count() 

    SectionText = ActiveDocument.Sections(i).Range.Text 

    If RegEx.test(SectionText) Then 
     Set RegC = RegEx.Execute(SectionText) 

     For Each RegM In RegC 

      Call ChangeThousandAndDecimalSeparator(RegM.Value) 

     Next 'For Each RegM In RegC 

     Set RegC = Nothing 
     Set RegM = Nothing 

    End If 

Next 'For i = 6 To ActiveDocument.Sections.Count() 

Set RegEx = Nothing 

End Sub 

답변

1

문제는 다음과 같습니다

여기 내 코드입니다.

대신을 시도해보십시오

With RegEx 
    .Global = True 
    .MultiLine = False 
    .Pattern = "(\d{1,3}X(\d{3}X)*\d{3}(,\d{1,3})?|\d{1,3},\d{1,3})" 
    .Pattern = Replace(.Pattern, "X", "[\s" & Chr(160) & "]") 
End With 

정규 표현식 패턴, 심지어는 비 분리 공백을 당신이 그들에 넣어 리터럴 문자와 일치합니다. VB 문자열에 줄 바꿈하지 않는 공간을 추가하는 유일한 방법은 Chr()으로 만듭니다.

+0

Tomalak 대단히 감사합니다! 내 비즈니스 규칙이 변경 되었기 때문에이 문제를 테스트 할 기회를 얻지 못했습니다. 당신의 방법이 크리스의 –

4

시퀀스 \s은 깨지지 않는 공간과 일치하지 않지만이를 수행 할 수있는 방법이 있습니다. 정규 표현식에서 사용하려는 원자는 \xnn 또는 \nnn입니다.이 문자는 16 진수 값 또는 8 진수 값과 일치합니다.

따라서 ASCII 160의 줄 바꿈하지 않는 공백과 일치 시키려면 대신 \xA0 또는 \240 중 하나를 지정하십시오.

+0

+1보다 더 편리하고, 사용하기가 더 쉽다는 것은 결코 다른 방법입니다. 'Chr()' – Tomalak

+0

thx를 사용하는 것보다 더 나은 Chris, 특히 설명. 매력으로 일했다! –

+0

+1 좋은 설명. – brettdj

관련 문제