所以我试图在一个字符串中找到一个字符串,现在我已经在其中构造了它,
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: '"
现在,就用法而言,这当然是完全不正确的,但是我的示例显示了*的使用,它等于任何可能性,因此无论空格数如何,我仍然可以从中提取内部文本类型。
答案 0 :(得分:3)
在这里,我们只需要在期望的输出(例如Example
之前和之后添加可选空格,就可以从此表达式开始,例如:
type:(\s+)?'(\s+)?(.+?)(\s+)?',
或:
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);
}
}
}
jex.im可视化正则表达式:
答案 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);
}
}
}
}
}
}