【问题标题】:C# removing string before/after delimiterC#在分隔符之前/之后删除字符串
【发布时间】:2016-03-13 08:11:53
【问题描述】:

我看到很多帖子在使用某些分隔符之前或之后使用 RegEx 删除部分字符串。事实是,我不懂 RegEx 并且有一个案例有点奇怪。情况如下:

我有一个字符串可以是:

string test1 = (something)...keepThisOne
string test2 = keepThisOne...(something)
string test3 = (something)...keepThisOne...(somethingelse)

到目前为止,我得到了:

string test = testx.Substring(testx.LastIndexOf('.')+1);

但它甚至对字符串 test1 也不起作用

我知道 RegExp 可用于删除此字符串中括号和所有“...”之间的所有内容。我的问题是如何在不事先知道我会得到什么样的字符串测试的情况下使用 RegExp 实现这一点,以及 RegExp 的含义是什么?

需要的输出是get only:

string result = keepThisOne

无论使用什么字符串测试。

【问题讨论】:

  • 您对这些的预期结果是什么?
  • 如果您使用的是 test1 预期的输出字符串是什么?
  • @SonerGönül 正如我所说,删除除 keepThisOne 之外的所有内容(我不知道字符串的长度或里面的内容,只是字符串的格式是 test1、2 或 3 之一)。
  • 所以如果你正在处理(something)....输出应该是something??

标签: c# regex string


【解决方案1】:

尝试使用正则表达式:

Regex rgx = new Regex(@"\.*\(\w*\)\.*");
string result = rgx.Replace(input, string.Empty);

Regex 将生成输出为

保持这个
保持这个
保持这个人

您可以在this fiddle 中运行各种场景。

【讨论】:

  • 我有一个好消息和一个坏消息。 RegEx 正确删除了括号内的所有内容,但保留了“...”
  • 我尝试添加一个 Replace(".", string.Empty);在得到没有括号的字符串和里面的内容之后。但它没有用,即使他显示它们也好像他不明白它们是这个字符串中的点
  • 字符与三个.不一样
  • @Slayner 有三个字符 ... 和这个 - 在第二个字符串中,您不能选择单个点。这是一个完全不同的角色,只是恰好看起来像三个点。你确定你有三个点而不是看起来像三个的单个字符吗?
  • @Slayner 是的,如果您有其他类型的点,那么没有一个答案会像现在这样正常工作是正常的。但其中大部分都可以轻松更改以匹配您的用例。
【解决方案2】:

这不需要正则表达式:

string test = testx.Split(new string[] { "..." }, StringSplitOptions.RemoveEmptyEntries)
    .Single(s => !s.StartsWith("(") && !s.EndsWith(")"));

这将原始字符串按点分割,只返回不以括号开头和结尾的部分。

【讨论】:

  • 我的方法出现错误:“'string.Split(string[],System.StringSplitOptions)' 的最佳重载方法匹配有一些无效参数。
  • 已修复,该函数采用一组分隔符字符串,而不是一个字符串。
  • 我用'string test = (ceci)...es'尝试了你的解决方案我收到一条错误消息,说“InvalidOperationException 未被用户代码处理”和“序列不包含匹配元素” .所以他显然试图删除它们,但似乎与我所拥有的不匹配。
  • 如果你运行这个你仍然得到一个错误?字符串 testx = "(ceci)...es"; string test = testx.Split(new string[] { "..." }, StringSplitOptions.RemoveEmptyEntries).Single(s => !s.StartsWith("(") && !s.EndsWith(")")); Console.WriteLine(test);
  • @K.Gkinis 是的,我遇到了同样的错误,它不匹配,我不知道为什么。
【解决方案3】:

您可以使用此代码(改编自another answer):

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        Regex rgx = new Regex(@"…*\.*\(\w*\)\.*…*");
        Console.WriteLine(rgx.Replace("(something)…keepThisOne", string.Empty));
        Console.WriteLine(rgx.Replace("keepThisOne…(something)", string.Empty));
        Console.WriteLine(rgx.Replace("(something)...keepThisOne…(somethingelse)", string.Empty));

    }
}

fiddle 中尝试一下。

【讨论】:

  • 查看关于 stribizhev 答案的评论。就好像他不明白它们是点,即使他展示它们。
  • @Slayner 现在试试我的答案。
  • 老兄就是这样,非常感谢,感谢所有帮助过我的人。
【解决方案4】:

这是一个适用于所有 3 种情况的 LINQ 解决方案:

var res = String.Join("", Char.IsLetter(input.First()) ?
                          input.TakeWhile(c => Char.IsLetter(c)) :
                          input.SkipWhile(c => c != '.')
                               .SkipWhile(c => c == '.')
                               .TakeWhile(c => Char.IsLetter(c)));

【讨论】:

  • 这样你跳过了点,但你保留了括号,里面是什么?
  • 看看Enumerable.SkipWhile,这里如果字符串中有点,则 lambda 会跳过点之前的所有字符,然后跳过点。
  • 所以这只适用于 test1 而不是 test2 或 3 因为 SkipeWhile 只删除点之前的内容。所以在 test2 中我会丢失我想要保留的东西。
  • 它也适用于 test2,因为有一个条件运算符 (Char.IsLetter(input.First()) ? (linq1) : (linq2)
  • 好的,我试了一下,结果只是一个空字符串。
猜你喜欢
  • 2021-06-13
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多