我确信这对于使用正则表达式的人来说是一个简单的问题:
我需要匹配所有内容直到角色#
我不希望字符跟在#字符后面,只是前面的东西,字符本身不应该匹配。这是最重要的部分,也是我主要要求的。作为第二个问题,我还想知道在#字符之后如何匹配其余部分。但不是在同一个表达中,因为我将在另一个环境中需要它。
这是一个示例字符串:
主题/ INSTALL.XML#id_install
我只想要topic / install.xml。对于第二个问题(单独的表达式),我想要id_install
答案 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
方法可能更容易。
答案 4 :(得分:0)
第一:
/[^\#]*(?=\#)/
修改:比/.*?(?=\#)/
第二:
/(?<=\#).*/
答案 5 :(得分:0)
对于C#中的这类内容,我通常会完全跳过正则表达式,并执行以下操作:
string[] split = exampleString.Split('#');
string firstString = split[0];
string secondString = split[1];