前向和后向RegEx查询

时间:2014-02-01 20:34:30

标签: c# regex

如何在没有点的情况下获得nserver的值?

它尝试了这个正则表达式,但我无法摆脱最后一个点。

nserver:(\s*)(?<Value>(\S*))

这是我搜索的数据

% By submitting a query to RIPN's Whois Service
% you agree to abide by the following terms of use:
% http://www.ripn.net/about/servpol.html#3.2 (in Russian) 
% http://www.ripn.net/about/en/servpol.html#3.2 (in English).

domain:        WEBMONEY.RU
nserver:       ns.molot.ru.
nserver:       ns.relsoftcom.ru.
nserver:       ns.relsoft.ru.
state:         REGISTERED, DELEGATED, VERIFIED
org:           "Computing Forces" CJSC
registrar:     RU-CENTER-REG-RIPN
admin-contact: https://www.nic.ru/whois
created:       1998.04.24
paid-till:     2014.05.01
free-date:     2014.06.01
source:        TCI

Last updated on 2014.02.02 00:06:43 MSK

我想要这个结果

ns.molot.ru

我正在使用这些选项

 RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Singleline;

2 个答案:

答案 0 :(得分:1)

嗯,这不是你的正则表达式:

(?<=nserver:)(\s*)(?<Value>.*(?=.\r\n))

? (换行/换行前的回车)

你也许可以逃避点,然后把贪婪的.*变成懒惰的.*?,但是没有前瞻的简单方法可能是:

(?<=nserver:)\s*(?<Value>\S+)\.

regex101 demo


由于评论而添加的说明:

  1. 这是\s*完成匹配,\S+开始匹配的地方:

      

    ns.molot.ru。

  2. 由于\S+匹配除空格以外的所有字符以及以下\r \n \t \f,因此它会匹配这些(加粗)并停止换行前:

      

    ns.molot.ru。

  3. 之后,正则表达式为\.,因此它会尝试匹配一个句点,但没有剩余时间可供匹配。 \S+然后回溯(从匹配中放弃一个字符)然后重试:

      

    ns.molot.ru

  4. 现在,在放弃匹配的最后一个字符后,正则表达式尝试再次匹配\.并成功。

    但如果您在\.之前\S+,则正则表达式将尝试匹配该期间,当它仍在此处时(步骤1):

      

    ns.molot.ru。

    但是因为那里有n,所以它不会匹配,整个正则表达式就会停在那里。

答案 1 :(得分:0)

快速方法,将您的模式更改为:

(?<=nserver:\s*)(?<Value>.*)(?=\.\r?\n)

您必须删除模式选项单行。