Разработка регулярного выражения для моих потребностей - PullRequest
1 голос
/ 14 февраля 2012

Я действительно плохо с регулярными выражениями и считаю их слишком сложными. Тем не менее, мне нужно использовать их для выполнения некоторых манипуляций со строками в классическом asp.

Строка ввода:

"James John Junior 

S.D. Industrial Corpn  
D-2341, Focal Point, Phase 4-a, 
Sarsona, Penns
Japan
Phone : 92-161-4633248 Fax : 92-161-253214
email : swerte_60@laher.com"

Желаемая строка вывода:

"JXXXX JXXX JXXXXX 

S.X. IXXXXXXXXX CXXXX  
D-XXXX, FXXXX PXXXX, PXXXX 4-X, 
SXXXXXX, PXXXX
JXXXX
PXXXX : 9X-XXX-XXXXXXX Fax : 9X-XXX-XXXXXX
eXXXX : sXXXXX_XX@XXXXX.XXX"

Примечание. Нам нужно разбить исходную строку на слова на основе одного пробела. Затем в этих словах нам нужно заменить все буквы (строчные и прописные) и цифры, кроме первого символа в каждом слове, на " X "

Я знаю, что это довольно сложно, но опытный эксперт по RegEx мог бы довольно легко поймать это, я думаю. Нет

Edit:

Я добился определенного прогресса. Нашел функцию (http://www.addedbytes.com/lab/vbscript-regular-expressions/), которая как бы выполняет свою работу. Но нуждается в небольшом уточнении, если кто-то может помочь

function ereg_replace(strOriginalString, strPattern, strReplacement, varIgnoreCase) 
' Function replaces pattern with replacement 
' varIgnoreCase must be TRUE (match is case insensitive) or FALSE (match is case sensitive) 
dim objRegExp : set objRegExp = new RegExp 
 with objRegExp 
    .Pattern = strPattern 
    .IgnoreCase = varIgnoreCase 
    .Global = True 
end with 
ereg_replace = objRegExp.replace(strOriginalString, strReplacement) 
set objRegExp = nothing 
end function

Я так называю -

orgstr = ereg_replace(orgstr, "\w", "X", True)

Однако результат выглядит как -

XXXXX XXXXXXXX

XXXXXXXX XXXXXXXX XXX.
XX, XXXXX XXXX, XXXXXX XXXXXX, XXXXXXX XXXXXXX, XXXXXXXXX
XXXXX : XXX-XXX-XXXX
XXX :
XXXXX : XXXXXX@XXXXXX.XX

Мне бы хотелось, чтобы в каждом слове отображался первый символ. Любая помощь там?

Ответы [ 4 ]

2 голосов
/ 15 февраля 2012

Этот подход приближается:

Function AnonymiseWord(m, p, s)

   AnonymiseWord = Left(m, 1) & String(Len(m) - 1, "X")

End Function 


Function AnonymiseText(input)

    Dim rgx: Set rgx = new RegExp
    rgx.Global = True
    rgx.Pattern = "\b\w+?\b"

    AnonymiseText = rgx.Replace(input, GetRef("AnonymiseWord"))

End Function

Это может приблизить вас к тому, что вам нужно, в противном случае основной подход - это звук, но вам, возможно, придется поиграть с этим шаблоном, чтобы он точно соответствовал отрезкам текста, которые вы хотите пропустить через AnonymiseWord.

1 голос
/ 14 февраля 2012

Я понятия не имею о классическом ASP, но если он поддерживает (отрицательные) lookbehinds и единственная проблема - это квантификатор в lookbehind, то почему бы не перевернуть его и сделать это так:

(?<!^)(?<!\s)[a-zA-Z0-9]

и заменить на «X».

Означает заменять каждую букву и цифру, если нет пробела или нет начала строки / строки перед.

См. здесь на Regexr

1 голос
/ 14 февраля 2012

Ну, в .NET это было бы легко:

resultString = Regex.Replace(subjectString, 
    @"(?<=         # Assert that there is before the current position...
     \b            # a word boundary
     \w            # one alphanumeric character (= first letter/digit/underscore)
     [\w.@-]*      # any number of alnum characters or ., @ or -
    )              # End of lookbehind
    [\p{L}\p{N}]   # Match any letter or digit to be replaced", 
    "X", RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);

Результат, однако, будет немного отличаться от того, что вы написали:

"JXXXX JXXX JXXXXX 

S.X. IXXXXXXXXX CXXXX  
D-XXXX, FXXXX PXXXX, PXXXX 4-X, 
SXXXXXX, PXXXX
JXXXX
PXXXX : 9X-XXX-XXXXXXX FXX : 9X-XXX-XXXXXX
eXXXX : sXXXXX_XX@XXXXX.XXX"

(заметьте, что Fax также был изменен на FXX)

Без .NET вы можете попробовать что-то вроде

orgstr = ereg_replace("\b(\w)[\w.@-]*", "\1XXXX", True); // not sure about the syntax here, you possibly need double backslashes

, что даст вам

"JXXXX JXXXX JXXXX 

SXXXX IXXXX CXXXX  
DXXXX, FXXXX PXXXX, PXXXX 4XXXX, 
SXXXX, PXXXX
JXXXX
PXXXX : 9XXXX FXXXX : 9XXXX
eXXXX : sXXXX"

Вы выиграли 'лучше, чем с одним регулярным выражением.

0 голосов
/ 14 февраля 2012

Хотя я люблю регулярные выражения, вы могли бы сделать это без них, особенно потому, что VBScript не поддерживает взгляд назад.

Dim mystring, myArray, newString, i, j
Const forbiddenChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
myString = "James John Junior   S.D. Industrial Corpn   D-2341, Focal Point, Phase 4-a,  Sarsona, Penns Japan Phone : 92-161-4633248 Fax : 92-161-253214 email : swerte_60@laher.com"
myArray = split(myString, " ")

For i = lbound(myArray) to ubound(myArray)
    newString = left(myArray(i), 1)
    For j = 2 to len(myArray(i))
        If instr(forbiddenChars, mid(myArray(i), j, 1)) > 0 Then
            newString = newString & "X"
        else
            newString = newString & mid(myArray(i), j, 1)
        End If
    Next
    myArray(i) = newString
Next

myString = join(myArray, " ")

Он не справляется с персонажем VbNewLine, но вы поймете идею. Вы можете выполнить дополнительное разбиение символа VbNewLine, выполнить итерацию по всем элементам и, например, разбить каждый элемент в пространстве.

...