正则表达式,获取可变长度字段并输出固定的字段

时间:2013-11-05 21:58:54

标签: php regex vbscript output

我需要将一个ID字段添加到由电子邮件地址的用户ID部分制作的plif文件中。我们的电子邮件用户ID是可变长度,但当我输出它作为ID时,输出必须正好是48个字符长。
查找电子邮件用户标识的正则表达式

 A(02||20)(N.* )([^ ]*)(\@[a-zA_Z.]*newpaltz.edu)

我到目前为止的电子邮件用户ID输出\ 3 =电子邮件用户ID& ZZZ只是一个占位符,所以我很容易找到我的出局。

 A02\3 ZZZ A\1\2\3\4


问题是我无法将输出格式化为正好48个字符。
这是我可能获得的3个电子邮件用户ID

toleveg
some.otheruser
n03468654

我必须输出格式如下:

A02toleveg             +                   00ACN
A02some.otheruser      +                   00ACN
A02n03468654           +                   00ACN

我一直在使用notepad ++,但我想我可能会切换到PHP。如果没有直接的正则表达式解决方案,VBscript或Jscript是我可以处理的其他语言。

2 个答案:

答案 0 :(得分:0)

如果你坚持使用VBScript,你可以在正则表达式的Replace方法上使用回调函数:

Set re = new RegExp
re.global = true
re.pattern = "A(02||20)(N.* )([^ ]*)(\@[a-zA_Z\.]*newpaltz.edu)"
myString = "A02Ntoleveg anyOtherText toleveg@bla.newpaltz.edu"
msgbox re.Replace(myString, getRef("replaceHelper"))

public function replaceHelper(match, fixed20or02, Nanything, emailLeft, emailRight, position, fullstring)
    Set sb = CreateObject("System.Text.StringBuilder")
    sb.Append_3 "A"
    sb.Append_3 fixed20or02
    sb.Append_3 left(emailLeft & string(48, " "), 48)
    sb.Append_3 "00ACN"

    replaceHelper = sb.ToString()
end function

' outputs: "A02toleveg                                         00ACN"

注意:我认为这不是您需要的确切输出,但您会明白这一点,很容易适应您的意愿。
注2:我使用了一个字符串构建器来学习和操作,但当然你仍然可以使用s = s & "text to append"
注意3:在正则表达式的最后一组中使用\..只会匹配所有内容 注4:电子邮件验证很难,请参阅Wikipedia。确保所有地址都匹配。 (您可以通过my*account{"@possible spam"!}@[IPv6:2001:db8:1ff::a0b:dbd0]

与我联系

答案 1 :(得分:0)

我有自己的工作解决方案,但它是在用Macro编程语言构建的Note Tab Pro中。多年来,我发现Note Tab Pro非常宝贵。所以它的价值在于我的代码。

Set Email ID as New User ID
    ^!Jump TEXT_START
    ^!Continue The PLIF File must be open in the active Window. This will make a user id field out of New Paltz email user ID if they have one.
    ^!set %count%=0
    ^!set %bannercount%=0
    ^!set %longones%=0
    ^!set %currentline%=0
    ^!set %longids%=""
    ^!set %numberoflines%=^$GetLineCount$
    ^!select ALL
    ^!Keyboard Ctrl+U
    ^!Replace "ANEWMN" >> "ANEW50" IASW 
    ^!Replace "A20N0" >> "A2080" TIAW 
    ^!Replace "NEWMNNEWMN00000000Y" >> "     NEWMN00000000Y" RIAW
    ;Replacements for second loader file
    ;^!Replace "A20N0([0-9]{7}[ ]+\+[ ]+)\d\dACN" >> "A0280$1\02ACN"  RWAS
    ^!Jump TEXT_START
    :findnext
    ^!find "( \d)(\d)(\d\d\d\dA16.+)( A)(02|20)(8[^ ]+)(.+ )([^ ]+)(\@[a-zA_Z.]*newpaltz.edu)" RAITS
    ^!IfError DONE
    ^!SetArray %Matches%=^$GetReSubStrings$
    ^!set %numofIDs%=^%Matches2%
    ^!set %email%=^%Matches8%
    ^!set %banner%=^%Matches6%
    ^!if ^$StrCopyRight(^%banner%;6)$=^$StrCopyRight(^%email%;6)$ usesbanner ELSE tryemail
    :usesbanner
    ^!inc %bannercount%
    ^!Jump LINE_END
    ^!set %newIDfield%=""
    ^!goto findnext
    :tryemail
    ^!set %emaillength%=^$StrSize(^%email%)$
    ^!if ^%emaillength% > 20 toobig ELSE doit
    :toobig
    ^!inc %longones%
    ^!set %longids%=^%longids%^P^%email%
    ^!Jump LINE_END
    ^!set %newIDfield%=""
    ^!goto findnext
    :doit
    ^!set %spaces%=^$Calc(20-^%emaillength%)$
    ^!set %newIDfield%=" A02^%email%^$StrRandom(^%spaces%; )$+                   02ACN                                                   "
    ^!Inc %count%
    ^!Inc %numofIDs%
    ^!StatusShow Don't touch Changing number ^%count%
    ^!InsertText ^%Matches1%^%numofIDs%^%Matches3%^%newIDfield%^%Matches4%^%Matches5%^%Matches6%^%Matches7%^%Matches8%^%Matches9%
    ^!Jump LINE_END
    ^!set %newIDfield%=""
    ^!goto findnext
    :DONE
    ^!Jump TEXT_START
    ^!Info [L]Added Campus IDs to ^%count% ^POut of ^%numberoflines% records^P^%bannercount% IDs = banner number alwready^P^P^%longones% IDs were too long: ^%longids%