2012-02-14 50 views
1

对于正则表达式我觉得很糟糕,并且发现它们太复杂。但是,我需要使用它们在经典的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 : [email protected]" 

所需的输出字符串:

"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 : [email protected]" 

注:我们需要再拆原字符串成字基于单一的空间,那些话,我们需要用“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 : [email protected] 

我想这显示每个单词中的第一个字符。有什么帮助吗?

+0

经典ASP?真?我会说你失去了运气,因为我敢打赌,经典的ASP(不像ASP.NET)不支持变量重复内部的后置断言,你肯定需要实现这一点。 – 2012-02-14 07:51:45

+0

我只是没有正则表达式......通过字符读取字符,并保持是否传递真实字符或X来输出的布尔值。然后,当你通过空白时意味着下一个字符是真实的。你也可以编程某些字符(比如@或者。)直接通过。比所有这些与正则表达式相关的问题要容易得多。 :) – Chris 2012-02-14 12:14:00

+0

答案在于'GetRef'和VBScript使用的正则表达式引擎为调用替换函数中找到的匹配函数调用函数的能力。然而,我现在还没有时间写出全部的内容,对其他答复者表示感谢,他们可以在回答问题之前发表一个答案,以说明我正在概述的内容。 – AnthonyWJones 2012-02-14 15:32:20

回答

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

+0

哇,我从来不知道'RegExp.Replace'可以采用这样的函数参考。我能找到的唯一半官方提及的是[MSDN技术文章](http://msdn.microsoft.com/en-us/library/ms974619.aspx#scripting12_topic4)。 – 2012-02-15 08:31:36

+0

谢谢托尼。这是我最终使用的那个。感谢你的帮助。虽然,如果我能以某种方式忽略匿名的大写字母,我会很喜欢它。我仍然试图找出如何做到这一点。 – 2012-02-15 10:08:39

+1

非常好用的regexp.replace。我不知道这个用法是被允许的。但是为什么不使用'string(xCount)'作为函数AnonymiseWord(m,p,s)中的字符重复:AnonymiseWord = Left(m,1)&String(“X”,len(m)-1):End Function'? – AutomatedChaos 2012-02-15 14:40:12

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) 
    [\[email protected]]*  # 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 : [email protected]" 

(观察Fax也有所改变到FXX

没有.NET,你可以尝试类似于

orgstr = ereg_replace("\b(\w)[\[email protected]]*", "\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

哦。真棒。你比我做得更好。非常感谢。让我试着将你的表达转化为asp。你的代码的第二行是什么?那是.NET语法还是正则表达式的一部分? – 2012-02-14 08:05:38

+0

它不会在ASP Classic中工作,只能在ASP.NET中使用,因为它不支持lookbehind内部的'*'量词,如果您想用X替换每个相关的字母,则需要使用'*'量词。逐字字符串的C#语法,所以反斜杠不必转义。 – 2012-02-14 08:08:32

+0

当!感谢洞察队友。那么,我的选择是什么? – 2012-02-14 08:12:24

1

我不知道传统的ASP的想法,但如果它不支持(负)lookbehinds,唯一的问题是在回顾后量词,那么为什么不把它周围,做这样说:

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

并用“X”替换。

意思是,如果没有空白或者不是字符串/行的开始,则替换每个字母和数字。

看到它here on Regexr

+0

不是。这在Classic Asp中不起作用。但是,谢谢。 – 2012-02-14 09:21:50

+0

好主意,如果lookbehind被支持。不过,我担心它不是,因为它似乎基于VBScript。 – 2012-02-14 09:23:23

0

虽然我爱正则表达式,你可以做到这一点,没有他们,特别是因为VBScript不支持向后看。

Dim mystring, myArray, newString, i, j 
Const forbiddenChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 
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 : [email protected]" 
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字符进行额外的分割,遍历所有元素并分割空间中的每个元素。

+0

感谢自动化。 – 2012-02-15 10:09:35