用于匹配可选字符的简单正则表达式?

时间:2011-08-14 21:10:01

标签: regex c#-4.0

我确信这对于使用正则表达式的人来说是一个简单的问题:

我需要匹配所有内容直到角色#

我不希望字符跟在#字符后面,只是前面的东西,字符本身不应该匹配。这是最重要的部分,也是我主要要求的。作为第二个问题,我还想知道在#字符之后如何匹配其余部分。但不是在同一个表达中,因为我将在另一个环境中需要它。

这是一个示例字符串:

主题/ INSTALL.XML#id_install

我只想要topic / install.xml。对于第二个问题(单独的表达式),我想要id_install

6 个答案:

答案 0 :(得分:3)

第一个表达:

^([^#]*)

第二个表达:

#(.*)$

答案 1 :(得分:0)

我不使用C#,但我会假设它使用pcre ......如果是的话,

"([^#]*)#.*"

调用'匹配'。对“搜索”的调用不需要尾随“。*”

parens定义'保持组'; [^#]表示任何不是'#'的字符

您可能尝试了类似

的内容
"(.*)#.*"

发现当多个'#'符号出现时它会失败(保持领先'#')? 那是因为“。*”是贪婪的,并且会尽可能地匹配。

你的匹配器应该有一个类似'group(...)'的方法。大多数匹配者 将整个匹配序列作为group(0)返回,第一个paren匹配组作为group(1), 等等。

PCRE非常重要我强烈建议您在谷歌上搜索它,学习它,并始终在您的编程工具包中使用它。

答案 2 :(得分:0)

[a-zA-Z0-9]*[\#]

如果您的字符串包含任何其他特殊字符,则需要将它们添加到转义的第一个方括号中。

答案 3 :(得分:0)

使用前瞻并向后看:

  • 获取所有角色,但不包括磅(#):.*?(?=\#)
  • 要获取所有字符,但不包括井号(#):(?<=\#).*

如果您不介意使用群组,可以一次性完成所有操作:

  • (.*?)\#(.*)您的答案将在第(1)组和第(2)组中。注意非贪婪的构造*?,它将尝试尽可能少地匹配而不是尽可能多。
  • 如果您想允许缺少#部分,请使用([^\#]*)(?:\#(.*))?。它使用非收集组来测试后半部分,如果找到它,则返回磅之后的所有内容。

老实说,对于你的情况,使用Split中提供的String方法可能更容易。

More on lookahead and lookbehind

答案 4 :(得分:0)

第一: /[^\#]*(?=\#)/ 修改:比/.*?(?=\#)/

更快

第二: /(?<=\#).*/

答案 5 :(得分:0)

对于C#中的这类内容,我通常会完全跳过正则表达式,并执行以下操作:

string[] split = exampleString.Split('#');
string firstString = split[0];
string secondString = split[1];