对于正则表达式我真的很糟糕,发现它们太复杂了。但是,我需要使用它们在经典的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
我希望这能显示每个单词中的第一个字符。有任何帮助吗?
答案 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”。
意思是,如果之前没有空格或不是字符串/行的开头,则替换每个字母和数字。
答案 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字符进行额外拆分,遍历所有元素并拆分空间上的每个元素。例如。