根据我的需要开发正则表达式

时间:2012-02-14 05:52:23

标签: regex asp-classic vbscript

对于正则表达式我真的很糟糕,发现它们太复杂了。但是,我需要使用它们在经典的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专家可以很容易地指出这一点。否?

编辑:

我取得了一些进展。找到了一种功能(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 个答案:

答案 0 :(得分:2)

这种方法很接近:

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 :(得分:1)

嗯,在.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"

你不会比单一的正则表达式更好。

答案 2 :(得分:1)

我不知道经典的ASP,但如果它确实支持(负面)lookbehinds,唯一的问题是lookbehind中的量词,那么为什么不把它转过来这样做:

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

并替换为“X”。

意思是,如果之前没有空格或不是字符串/行的开头,则替换每个字母和数字。

here on Regexr

答案 3 :(得分:0)

虽然我喜欢正则表达式,但如果没有正则表达式,你可以这样做,特别是因为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字符进行额外拆分,遍历所有元素并拆分空间上的每个元素。例如。