0

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

 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

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

4

2 回答 2

0

好吧,我自己有一个可行的解决方案,但它是在内置宏编程语言的 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%
于 2013-11-07T22:31:56.513 回答
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:\.在正则表达式的最后一组中使用 a 。.将匹配所有内容。
注意 4:电子邮件验证很困难,请参阅Wikipedia。确保所有地址都匹配。(您可以通过以下方式与我联系my*account{"@possible spam"!}@[IPv6:2001:db8:1ff::a0b:dbd0]

于 2013-11-06T08:11:35.663 回答