用于获取“$$”之间的字符串值的正则表达式

时间:2012-11-02 14:24:14

标签: c# asp.net regex string

以下是处理Doc文件后得到的string ....

$$JHFIRMPHONE-91$$
$$SYSDATE-4$$
Dear  $$RCSALUTATION-5$$,
$$PAPTRANSMITTHANKS-34$$$$IPOWERPACKAGE-56$$$$CASHCARDLOADED-57$$$$CASHCARDTYPE-58$$$$ACTIVATE-59$$$$REFUNDBALANCEDUE-63$$$$FLEXPAY-68$$$$FLEXPAYCONT-67$$
$$REFBALDU$$$$EEXT-73$$
$$RALCASHCARD-64$$
$$ACRCASHCARD-65$$
$$CHECKMONEYCREDITCARD-61$$
$$NOPAYFULL-62$$
$$RAFMEMO-38$$$$RAFMEMOPT2-44$$
$$AMENDED-24$$
$$FORMSSCHEDULES-11$$
$$FORMS_LIST$$
$$FDHANDWRITTENATTACHMENTS-35$$
$$FDATTACHMENTS-26$$
$$FURNISHEDCOPIESKEEP-69$$
$$ESORDEATH-36$$
$$GOLDGUARANTEE-20$$
$$BASICGUARANTEE1-76$$$$BASICGUARANTEE2-77$$$$BASICGUARANTEE3-78$$
$$STONLYOPC-37$$
$$STATE-14$$
$$ST_DATA$$
$$STHANDWRITTENATTACHMENTS-29$$
$$STATTACHMENTS-27$$
$$TAXCOURSE-72$$
$$REWARDTYPE-82$$$$REWARDTYPE2-83$$$$REWARDTYPE3-84$$$$HEALTHBENEFITS-92$$$$HEALTHBENEFITS2-93$$$$HEALTHBENEFITS3-94$$$$HEALTHBENEFITS4-95$$$$HEALTHBENEFITS5-96$$
$$SINCERELY-40$$
$$CLOSING-16$$
$$JHTAXSERVICE-17$$
$$RAFSTARMEMO-45$$
$$RAFSTARMEMO2-97$$

我想要的是,我需要在text values$$之间获取所有$$。我不知道如何以有效的方式执行此操作...我想要解决这个问题的一些Regular Expression解决方案。我对Regular Expression知之甚少,所以请大家帮帮我...除了正则表达式之外的任何有效解决方案也会...提前感谢...

3 个答案:

答案 0 :(得分:4)

Here are some regex basics, worth reading up on.

就您的具体问题而言:

foreach(Match match in Regex.Matches(input, @"\$\$(.*?)\$\$"))
{
    string textValue = match.Groups[1].Value;
    // process the text value
}

正则表达式匹配,两个文字$,然后任意多个非换行符(只有必要)才能再增加两个$。由于匹配不能重叠,因此不存在从结尾$$到结尾$$获得额外匹配的危险。

效率稍高且通常推荐的正则表达式是:

@"\$\$((?!\$\$).)*\$\$"

它基本上做同样的事情,只是正则表达式内部有点不同(看看“前瞻”)。

事实上,如果您可以保证文本值始终只包含字母,数字,下划线和连字符,您可以使用:

@"\$\$([\w-]+)\$\$"

对于所有三种情况,并非如此,有些人更愿意将\$\$替换为\${2},但我个人认为两次重复不需要这样做。

答案 1 :(得分:1)

我认为\$\$([A-Z0-9\_\-]+?)\$\$应该涵盖负载。

您可能想要检查允许多行解析的额外参数。

查看this link以获取有关正则表达式

的更多详细信息

答案 2 :(得分:1)

实际上不需要正则表达式。您的文字很容易按String.Split分割。

var parts = str.Split(new string[] {"$$"}, StringSplitOptions.RemoveEmptyEntries);