【问题标题】:select first character before and after an expression选择表达式前后的第一个字符
【发布时间】:2016-04-12 18:47:21
【问题描述】:

我有一个字符串在 UI 中显示为 Some Company Name,但在 HTML 中是 Some html text S<!--START CompanyName-->ome Company Nam<!--END CompanyName-->e some html text。不要问我为什么。

如何选择S<!--START CompanyName-->ome Company Nam<!--END CompanyName-->e

在 C# 中使用正则表达式?当然,Some Company Name 可以是任何其他公司名称。

附:一个模式可以重复不止一次。

附言cmets 中的CompanyName 是一个标签。

【问题讨论】:

  • 我在问“为什么”?似乎在另一个问题上改造基于正则表达式的解决方案只会使问题更加复杂。从源头解决问题。
  • 因为某个js富文本编辑器插件。
  • 由于这些是 HTML/XML cmets,我不会为正则表达式而烦恼。我只需将字符串提供给解析器并获取结果文档的内部文本。
  • 有点脏,但一个简单的replace 也可以解决问题。
  • 以及如何在评论前后选择一个字符?在替换的那一刻,我不知道这些字符到底是什么。

标签: c# regex


【解决方案1】:

我假设您的公司名称包含在较大的 HTML 中,并且公司是使用 cmets 以您描述的奇怪方式“分隔”的。

因此,您想提取使用蓝色文本“分隔”的红色文本。您想忽略绿色文本。

这是正确的,您可以像这样提取公司名称:

var text = "bla bla S<!--START CompanyName-->ome Company Nam<!--END CompanyName-->e more bla bla";
var regex = new Regex(@"(?<begin>.)<!--START CompanyName-->(?<middle>[^<]+)<!--END CompanyName-->(?<end>.)");
var match = regex.Match(text);
if (match.Success) {
  var companyName = match.Groups["begin"].Value + match.Groups["middle"].Value + match.Groups["end"].Value;
  Console.WriteLine(companyName);
}

简而言之,您创建一个匹配红色和蓝色文本的模式,然后通过添加组来“抓取”红色文本。然后将这些组连接起来以创建最终结果。

如果您想在文本中找到所有像这样“分隔”的公司名称,您可以使用Regex.Matches 方法:

var companyNames = regex.Matches(text).Cast<Match>()
  .Select(match => match.Groups["begin"].Value + match.Groups["middle"].Value + match.Groups["end"].Value);

如果您只是想用另一个名称替换公司名称(并且没有 HTML 注释),您可以使用 Regex.Replace ,其中组已从模式中删除:

var text = "bla bla S<!--START CompanyName-->ome Company Nam<!--END CompanyName-->e more bla bla";
var regex = new Regex(@".<!--START CompanyName-->[^<]+<!--END CompanyName-->.");
var newText = regex.Replace(text, "ACME Industries");

如果您想保留 HTML cmets,您必须将组放回模式中并进行更高级的替换。

【讨论】:

  • 我相信CompanyName 可能会有所不同,因此您不能在正则表达式中逐字逐句地使用它。
  • @FrédéricHamidi:公司名称不在正则表达式中。
  • new Regex(@"(?&lt;begin&gt;.)&lt;!--START CompanyName--&gt;(?&lt;middle&gt;[^&lt;]+)&lt;!--END CompanyName--&gt;(?&lt;end&gt;.)") -- 对我来说它出现了两次,但我可能遗漏了一些东西。
  • @FrédéricHamidi:我的理解是CompanyName是文本中的一个“标签”,用于标识公司名称的位置。两个 HTML cmets 之间的文本以及前后的字母是实际的公司名称。
  • 我明白了。您可能是对的,从问题中不清楚。
【解决方案2】:
  1. 从字符串中删除所有 html cmets。
  2. 搜索您要查找的字符串。

  1. 查找带有注释的字符串(可能使用此注释作为基础)。
  2. 从结果中删除评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多