【问题标题】:Split using regex with (#something)使用带有 (#something) 的正则表达式拆分
【发布时间】:2017-03-18 05:00:57
【问题描述】:

我想在 c# 中使用正则表达式分割上面的字符串

输入:

"some1 Text (#something) someothertext (#something) some3 Text"

预期输出:

some1 Text
someothertext
some3 Text

我的代码

string str = "some1 Text (#something) someothertext (#something) some3 Text";
Regex regex = new Regex(@"\(([^)]*)\)", RegexOptions.IgnoreCase);
var result = regex.Split(str);

输出

some1 Text
#something
someothertext
#something
some3 Text

【问题讨论】:

  • 当您要匹配的值是some1Text 时,为什么要提到(#something)?这是字段之间的分隔符吗?这个字符串的模式是什么?字段用(#...) 分隔,键值用一个空格分隔?
  • 请给出一个更具体的例子,包括你尝试过的一些代码
  • 你可以忽略它并匹配内容,例如\w+ \w+。这将返回预期的输出。
  • 字段呢?它们包含什么?为什么你不能只使用\w+ \w+
  • @umeshgangwar 和我已经提供了一个有效的模式。你试过了吗?你的例子是真实的吗?您的数据是否使用未分隔的字符串或其他内容? 具体

标签: c# regex


【解决方案1】:
String input = "some1 Text (#One) some2 other (#something) some3 Text";
String pattern = @"\(#.*?\)";
System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(pattern);
string output = regex.Replace(input, System.Environment.NewLine);

正则表达式分解:\(#.*?\)

  • 转义的左括号:\\(
  • 英镑符号:#
  • 匹配任意数量的字符:.*
  • 非贪婪运算符:?
  • 转义右括号: \\)

【讨论】:

  • 这将匹配分隔符,而不是字段
  • 这就是想法 - 用新行替换分隔符。
  • 你可以用verbatim string代替"\\(.*?\\)"@"\(.*?\)"更容易阅读。
  • @"\(#.*?\)" 可能更准确,因为所有分隔符都以井号开头。
  • 我不确定问题的更大背景,但在这里为匹配添加 # 似乎非常合理。
【解决方案2】:

您可以使用(?<field>[^\(]+)(?<delim>\(#[^\)]*\))? 匹配分隔符和字段。您可以按名称引用每个部分,例如fielddelim。例如:

var input = "some1 Text (#One) some2 other (#something) some3 Text";
var pattern = @"(?<field>[^\(]+)(?<delim>\(#[^\)]*\))??";

var matches = Regex.Matches(input,pattern);
var fields=from match in matches.OfType<Match>()
           select match.Group["field"].Value;
foreach(var field in fields)
{
    Console.WriteLine(field);
}

结果:

some1 Text  
 some2 other  
 some3 Text 

表达式捕获不是( 的所有内容作为字段。 (# and)` 之间的任何内容都被捕获为分隔符。

捕获并不意味着生成了一个字符串。循环只检索字段的值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多