字符串上的C#正则表达式

时间:2019-06-10 14:46:53

标签: c# regex

所以我试图在一个字符串中找到一个字符串,现在我已经在其中构造了它,

string str4;

var str5 = "   type: '");
foreach (string str6 in response.Split(new char[] { '\n' }))
{
    if (str6.StartsWith(str5))
    {
        str4 = str6.Replace(str5, "").Replace(" ", "").Replace("',", "");
        break;
    }
}

将按预期工作,并将从

抓取文字
type: '

这个例子是

type: ' EXAMPLE ',

循环后输出

EXAMPLE

现在的问题是,'type:'开头的空格有时会有所不同,因此有时它可能等于我提供的空格,而有时它可能不相等。.

我正尝试使用Regex,以便可以执行诸如

string str5 = "Regex(*)type: '"

现在,就用法而言,这当然是完全不正确的,但是我的示例显示了*的使用,它等于任何可能性,因此无论空格数如何,我仍然可以从中提取内部文本类型。

4 个答案:

答案 0 :(得分:3)

在这里,我们只需要在期望的输出(例如Example之前和之后添加可选空格,就可以从此表达式开始,例如:

type:(\s+)?'(\s+)?(.+?)(\s+)?',

Demo

或:

type:(\s+)?'(\s+)?(.+?)(\s+)?'

如果我们可能具有'类型,则可以将表达式扩展为:

type:(\s+)?['"](\s+)?(.+?)(\s+)?['"]

测试

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"type:(\s+)?'(\s+)?(.+?)(\s+)?',";
        string input = @"type:' EXAMPLE ',
type: ' EXAMPLE ',
type:    '   EXAMPLE    ',
type:    '   Any other EXAMPLE we might have   ',";
        RegexOptions options = RegexOptions.Multiline;

        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

RegEx电路

jex.im可视化正则表达式:

enter image description here

答案 1 :(得分:2)

您可以使用.Trim().TrimStart().TrimEnd()。使用Regex看起来确实不需要额外的开销。

答案 2 :(得分:1)

如果这只是一个简单的提取任务,并且输入的变化非常有限,则可以 使用纯正则表达式来完成它:

var response = @"[{
   type: 'foo',
something: 'bar',
},
{
  type: 'baz',
  something: 'bat'
}]";
var types = Regex.Matches(response, @"\s*type\:\s*\'(.+)\'")
    .Cast<Match>()
    .Select(m => m.Groups.Cast<Group>().Skip(1).Single().Value);

但是听起来像,您可能正在尝试为一种编程语言或标记语言编写解析器。如果是这样,我强烈建议您不要尝试使用Regex来做到这一点。当您开始尝试处理转义字符串("type: 'I\'m a type: '")之类的内容时,正则表达式会变得非常毛骨悚然。

如果您输入的格式为JSON之类的标准格式,请使用该格式的解析库。如果不是这样,则可以使用Sprache之类的库来轻松创建功能强大的自定义解析器。

答案 3 :(得分:0)

首先,如果您要使用Regex,请在此处尝试使用正则表达式字符串:https://regex101.com/

第二,如果您可以避免使用RegEx,我建议您这样做。如果开发人员使用正则表达式解决问题,那么他现在有两个问题。如果您工作不多,则正则表达式可能会很棘手。话虽如此,这是另一个基于正则表达式的解决方案。另外,通常有几种方法可以构造RegEx字符串。

using System;
using System.Text.RegularExpressions;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] SampleInputList = new string[]
            {
                "type:EXAMPLE",
                " type: EXAMPLE ",
                "   type:  EXAMPLE  "
            };

            // The following is a non-capture group indicator: (?:)
            // non-capture groups are a good way to organize parts
            // of your regex string and can help you visualize the
            // parts that are just markers like 'type:' vs. the parts
            // that you want to actually manipulate in the code.
            Regex expression = new Regex(@"(?:\s*type\:\s*)([A-Za-z]*)");

            foreach (string Sample in SampleInputList)
            {
                MatchCollection matches = expression.Matches(Sample);
                if (matches.Count > 0)
                {
                    GroupCollection groups = matches[0].Groups;
                    if (groups.Count > 1)
                    {
                        Console.WriteLine(groups[1].Value);
                    }
                }
            }
        }
    }
}