【问题标题】:Regular expression that gets a variable length field and outputs a field that is fixed获取可变长度字段并输出固定字段的正则表达式
【发布时间】:2013-11-05 21:58:54
【问题描述】:

我需要将 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

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

【问题讨论】:

  • 什么是新的 33 个字符,它们应该在哪里?介于两者之间?
  • 其他字符并不总是 33 个字符。我在上面添加了输入和输出示例。
  • 所以中间有空格和加号?您需要展示一些 PHP 代码来获取地址并连接各个部分。 str_pad()str_repeat() 可能会有所帮助。

标签: php regex vbscript output


【解决方案1】:

如果你坚持使用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]与我联系)

【讨论】:

  • 是的,谢谢,我最终将电子邮件 ID 部分设置为一个变量,得到它的长度,然后从可用空格数中减去它,然后使用该数字在其后重复该空格数。但我是在内置编程语言的 NoteTab Pros 中完成的,这与其他任何东西都不一样,所以我不确定我的代码会有多有价值。如果正则表达式替换输出可以收集长度等属性并进行一些数学运算,我会很高兴。
【解决方案2】:

好吧,我自己有一个可行的解决方案,但它是在内置宏编程语言的 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%

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多