正则表达式;在单个字符串中查找2个特定单词之间的单词

时间:2017-09-21 18:02:26

标签: c# regex

我有以下字符串:

Account has been reset and assigned the following temporary password:

NvSYVZeg

Please log into your account using your email address and the temporary password.

我想要做的是获取临时密码( NvSYVZeg 部分)并将其放入自己的字符串变量中。我已经看了好几个小时,尝试了我在网上找到的多个表达式(在RegexStorm.com和RegExr.com上测试过),他们似乎找不到临时密码。我试过了:

(?<=password:\s)(.*?)(?=\sPlease) 

(password:)(.*?)(Please)

但他们都不适合我。有任何想法吗?

2 个答案:

答案 0 :(得分:2)

密码和前导/尾随分隔符之间有1个以上的空格。因此,您需要使用\s*(任何0 或更多空白符号):

password:\s*(.*?)\s*Please
         ^^^     ^^^

(?<=password:\s*).*?(?=\s*Please)
             ^^^       ^^^

请参阅regex demo

第一个可能像

一样使用
var m = Regex.Match(s, @"password:\s*(.*?)\s*Please");
if (m.Success) 
{
    Console.WriteLine(m.Groups[1].Value);
}

如果您使用第二个,只需访问m.Value

答案 1 :(得分:0)

通过使用RightToLeft的正则表达式选项,我们告诉解析器向后工作而不是向前工作,这在我看来更容易制作模式。 请注意,虽然解析器反向运行,但我们的模式仍然像往常一样表示为正向

如果我们在心理上,在我们的模式中,从锚^Password向后工作,我们只需要通过指定\s+来吃掉所有空格。然后,一旦所有空间被消耗,我们所要做的就是提取所有空格直到换行。模式将是

 (?<Password>[^\r\n]+)\s+^Please 

然后使用命名组myMatch.Groups["Password"].value在C#中提取实际密码。

请注意模式中的^,我们也需要选项Multiline