Regex - czy dany tekst występuje?

Regex - czy dany tekst występuje?

Wątek przeniesiony 2024-06-25 14:22 z Inne języki programowania przez cerrato.

JA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 127
0

Cześć,

mam taki kod:

Kopiuj
Sub Test()

Dim textString As String
Dim PatternToFind As String
Dim tablename As String

tablename = "T_DATACENTERSSOURCE"

textString = "=INDEX(INDIRECT(""T_DATACENTERSSOURCE[DATACENTER]""),MATCH([@RegionName],T_DATACENTERSSOURCE[LOCATIONID]),0))"
**PatternToFind = "(?!""" & tablename & ")"**

If IsNamePresent(textString, PatternToFind) = True Then
        MsgBox "ok"
End If

End Sub

Function IsNamePresent(ByVal inputString As String, testName As String)
    IsNamePresent = False
    With CreateObject("vbscript.regexp")
        .Global = True
        .IgnoreCase = False
        .Pattern = testName
        If .Test(inputString) Then IsNamePresent = True
    End With
End Function

Jest to tylko przykład na potrzeby tego tematu.

W całościowym makrze robię petlę i w kazdej formule (string), jesli znajde dokładną nazwę tabeli , która nie jest w funkcji "INDIRECT" - dodaje INDIRECT.

Czyli w przykładzie powyżej w ciągu textString dla tabeli T_DATACENTERSSOURCE[LOCATIONID] muszę dodać "INDiRECT".
Ale żeby nie kręcić się wkoło powinien znaleźć czy w danej formule są nazwy tabeli bez cudzysłowy z przodu (to wskazuje czy była użyta funckja INDIRECT czy nie).

Próbuję napisać taki pattern do regex'a, który wskaże czy w danej formula jest dokładna nazwa tabeli bez " z przodu.
Dokładna czyli "T_DATACENTER" juz nie powinno pasować.

Jak to zrobić?

Kod powyżej nie działa (patternToFind jest błędny)
Dzieki za pomoc,
Jacek

DB
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 36
1

Jeśli dobrze zrozumiałem

Kopiuj
Sub Test()

Dim textString As String
Dim PatternToFind As String
Dim tablename As String

tablename = Replace(Replace("T_DATACENTERSSOURCE[LOCATIONID]", "[", "\["), "]", "\]")

textString = "=INDEX(INDIRECT(""T_DATACENTERSSOURCE[DATACENTER]""),MATCH([@RegionName],T_DATACENTERSSOURCE[LOCATIONID]),0))"

PatternToFind = "(.*)[^""]" & tablename & "[^""](.*)"

If IsNamePresent(textString, PatternToFind) = True Then
        MsgBox "ok"
End If

End Sub

Function IsNamePresent(ByVal inputString As String, testName As String)
    IsNamePresent = False
    With CreateObject("vbscript.regexp")
        .Global = True
        .IgnoreCase = False
        .Pattern = testName
        
        If .Test(inputString) Then IsNamePresent = True
    End With
End Function

JA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 127
0

Cześć,

dziękuję bardzo!

Czyli, aby sprawdzić i wykluczyć tylko cudzysłów z przodu powinien użyć? (bo widzę, że z tyłu też dałes warunek na cudzysłów?):

PatternToFind = "(.)[^""]" & tablename & "(.)"```

Kopiuj

Dziekuje,
Jacek

JA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 127
0

I jeszcze pytanie,

czy w regex mogę sprawdzić od którego znaku mam pierwsze wystąpienie danego słowa?
czyli zwrócić long kiedy pattern zostanie znalezniony (coś takiego jak instr)?

Jacek

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.