匹配以“the”或“a”开头并以数字结尾的句子的一部分

时间:2018-03-10 05:32:49

标签: c# regex

我需要一个标识以下内容的正则表达式:“[或a] [text] [number]”

例如,在以下字符串中:

"the foo or the bar 100"

我需要一个单独匹配的正则表达式

192.168.

没有匹配

function getLocalIp() {
    const os = require('os');

    for(let addresses of Object.values(os.networkInterfaces())) {
        for(let add of addresses) {
            if(add.address.startsWith('192.168.')) {
                return add.address;
            }
        }
    }
}

有什么建议吗?

我正在用C#实现正则表达式。

3 个答案:

答案 0 :(得分:1)

我认为这样可行......虽然可能有一种不那么冗长的方式

\bthe\b(?:(?!\bthe\b).)*?\d+|\ba\b(?:(?!\ba\b).)*?\d+

解释

鉴于第一部分\bthe\b(?:(?!\bthe\b).)*?\d+

  • \b在字边界处断言位置
  • the字面匹配字符the
  • \b在字边界处断言位置

非捕获组(?:(?!\bthe\b).)*?

  • *?量词 - 零和无限次之间的匹配,尽可能少,根据需要扩展(懒惰)

否定前瞻(?!\bthe\b) 断言下面的正则表达式不匹配

  • \b在字边界处断言位置
  • the字面匹配字符the
  • \b在字边界处断言位置

继续

  • .匹配任何字符(行终止符除外)
  • \d+匹配一个数字(等于[0-9])
  • +量词 - 在一次和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)

示例

var pattern = @"\bthe\b(?:(?!\bthe\b).)*?\d+|\ba\b(?:(?!\ba\b).)*?\d+";
var input = "The foo or the bar 100. A large machine 200. The transformer 100 and a bridge 200. GufftheGuff guffAguff is not matching 100";

Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);

var matches = regex.Matches(input);

foreach (Match match in matches)
{
   Console.WriteLine(match.Value);
}

<强>输出

"the bar 100"
"A large machine 200"
"The transformer 100"
"a bridge 200"

Here is a demo for your amusement

You can play with it a bit more here

答案 1 :(得分:0)

你非常接近。你需要的只是一个消极的期待。

以下是你的正则表达方式:

(?i)((?!\ba\b.*?\ba\b)\ba\b.+?\d+)|((?!\bthe\b.*?\bthe\b)\bthe\b.+?\d+)

基本上\b元字符可以将thea作为单词匹配,而不是作为单词的一部分。因此,如果你将它们剥离出来,你会得到:

(?i)((?!the.+?the)the.+?\d+)|((?!a.+?a)a.+?\d+)

让我们看看其中一个,了解它的作用:

((?!the.+?the)the.+?\d+)
 ^ -- Negative lookahead to ensure that the matched group doesn't have the word "the" twice
              ^ -- There is a word "the"
                ^ -- Followed by any characters
                    ^ -- Followed by some digits

同样适用于正则表达式的其他部分。

您可以在此处尝试各种组合:https://regex101.com/r/ZNMg7E/3

答案 2 :(得分:-1)

尝试此模式 or\s(?<w1>[\w\s]+).\s(?<w2>[\w\s]+).
代码

string bs = "The foo or the bar 100. A large machine 200.";
        Regex regex = new Regex(@"or\s(?<w1>[\w\s]+).\s(?<w2>[\w\s]+).");
        Match match = regex.Match(bs);
        if (match.Success)
        {
        Console.WriteLine(match.Groups["w1"].Value);
        Console.WriteLine(match.Groups["w2"].Value);
        }
        // Outputs "the bar 100" and "A large machine 200"

这不是正则表达式,但如果你不能使用正则表达式,你仍然可以使用它

string bs = "The foo or the bar 100. A large machine 200.";
        string[] dotspl = bs.Split(new string[]{". "}, StringSplitOptions.None);
        string pt1 = dotspl[0].Split(new string[]{" or "}, StringSplitOptions.None)[1];
        string pt2 = dotspl[1];
        Console.WriteLine(pt1 + " and " + pt2);