RegEx для замены части строки, включая одинарные кавычки (') - PullRequest
2 голосов
/ 11 мая 2019

Я пытаюсь заменить часть текста между апострофами, а не все, только часть.Например, мне нужно заменить символы / * и * /, которые находятся внутри текста между кавычками, на пустой текст, но не за его пределами.

Мой вводимый текст, например:

A = 'THIS IS AN ALPHABETIC /* CONSTANT' || WS_CON1 /* */ || 'TEST STRING */';

Ожидаемый результат:

A = 'THIS IS AN ALPHABETIC  CONSTANT' || WS_CON1 /* */ || 'TEST STRING ';

Я извлек текст в кавычки, но не знаю, как заменить / * и * / нулевым текстом.

Sub ReplaceWithRegex()
    Dim strPattern As String
    Dim strReplace As String
    Dim regEx As Variant
    Dim strtxt As String

    Set regEx = CreateObject("vbscript.regexp")
    strtxt = "A = 'THIS IS AN ALPHABETIC /* CONSTANT' || WS_CON1 /* */ || ' TEST STRING */';"
    strPattern = "\'([^\']*)\'"
    strReplace = ""

    With regEx
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        .Pattern = strPattern
    End With

    If regEx.Test(strtxt) Then
        Debug.Print regEx.Replace(strtxt, strReplace)
    Else
        MsgBox ("Not matched")
    End If
End Sub

Очевидно, это заменяет весь текст между кавычками на пустую строку.

Как мне решить эту проблему?

Ответы [ 2 ]

6 голосов
/ 11 мая 2019

Это выражение может помочь вам заменить нежелательные /*:

[A-Z]\s\/\*\s[A-Z]

Вы можете просто обернуть связанные его части группами захвата (), аналогично:

([A-Z])\s(\/\*)\s([A-Z])

Затем вы можете заменить его на $1 $3 и игнорировать вторую нежелательную группу:

enter image description here

Этот инструмент помогает вам изменять / изменять / редактировать ваши выражения по вашему желанию.

Описательный график RegEx

Эта ссылка поможет вам визуализировать ваши выражения:

enter image description here* * 1030

Редактировать

Если в этих группах захвата больше шаблонов, вы можете просто добавить их, используя | , , например :

([A-Z])\s(\/\*|\*\/)(\s[A-Z]|\x27)

Возможно, вы захотите использовать \x27 вместо ', чтобы ваш код легко читался.

enter image description here

JavaScript Demo

const regex = /([A-Z])\s(\/\*|\*\/)(\s[A-Z]|\x27)/gm;
const str = `A = 'THIS IS AN ALPHABETIC /* CONSTANT\' || WS_CON1 /* */ || \'TEST STRING */';`;
const subst = `$1$3`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

Тест производительности

Этот фрагмент возвращает время выполнения цикла for в миллион раз

.

const repeat = 1000000;
const start = Date.now();

for (var i = repeat; i >= 0; i--) {
	const regex = /([A-Z])\s(\/\*|\*\/)(\s[A-Z]|\x27)/gm;
	const str = `A = 'THIS IS AN ALPHABETIC /* CONSTANT\' || WS_CON1 /* */ || \'TEST STRING */';`;
	const subst = `$1$3`;

	var match = str.replace(regex, subst);
}

const end = Date.now() - start;
console.log("YAAAY! \"" + match + "\" is a match ??? ");
console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test. ? ");
4 голосов
/ 11 мая 2019

Вот еще один метод VBA с использованием регулярных выражений.

Option Explicit
'Set Reference to Microsoft VBScript Regular Expressions 5.5
Function reReplaceComment(S As String) As String
  Dim RE As RegExp
  Dim I As Long, J As Long

Set RE = New RegExp
With RE
    .Global = True
    .Pattern = "('[^']*?)(?:(?:/\*)|(?:\*/))([^']*?')"
    reReplaceComment = .Replace(S, "$1$2")
End With
End Function

Удаление токенов в одинарных кавычках

('[^']*?)(?:(?:/\*)|(?:\*/))([^']*?')

$ 1 $ 2

Создано с помощью RegexBuddy

enter image description here

...