将字符串拆分为单词并与其他数据重新连接

2024-03-17

我有一个使用的方法Regex寻找文本中的模式string。它可以工作,但不足以继续下去,因为它需要文本出现在确切的顺序,而不是将短语视为一组单词。

    public static string HighlightExceptV1(this string text, string wordsToExclude)
    {
        // Original version
        // wordsToExclude usually consists of a 1, 2 or 3 word term.
        // The text must be in a specific order to work.

        var pattern = $@"(\s*\b{wordsToExclude}\b\s*)";

        // Do something to string...
    }

这个版本对以前的版本进行了改进,因为它确实允许单词以任何顺序匹配,但是它导致一些间距问题在最终输出中,因为间距被删除并替换为管道。

    public static string HighlightExceptV2(this string text, string wordsToExclude)
    {
        // This version allows the words to be matched in any order, but it has
        // flaws, in that the natural spacing is removed in some cases.
        var words = wordsToExclude.Replace(' ', '|');

        var pattern = $@"(\s*\b{words}\b\s*)";

        // Example phase: big blue widget
        // Example output: $@"(\s*\bbig|blue|widget\b\s*)"

        // Do something to string...
    }

理想情况下,每个单词周围需要保留间距。下面的伪示例显示了我正在尝试做的事情。

  1. 将原始短语拆分为单词
  2. 将每个单词包装在正则表达式模式中,以保留空间 当匹配时
  3. 重新连接单词模式以生成将用于的模式 匹配

    public static string HighlightExceptV3(this string text, string wordsToExclude)
    {
        // The outputted pattern must be dynamic due to unknown
        // words in phrase.
    
        // Example phrase: big blue widgets
    
        var words = wordsToExclude.Replace(' ', '|');
        // Example: big|blue|widget
    
        // The code below isn't complete - merely an example
        // of the required output.
    
        var wordPattern = $@"\s*\b{word}\b\s*";
        // Example: $@"\s*\bwidget\b\s*"
    
        var phrasePattern = "$({rejoinedArray})";
        // @"(\s*\bbig\b\s*|\s*\bblue\b\s*|\s*\bwidget\b\s*)";
    
        // Do something to string...
    }
    

注意:可能有更好的方法来处理单词边界间距,但我不是正则表达式专家。

我正在寻找一些帮助/建议来获取分割数组,包装它,然后以最简洁的方式重新加入它。


您需要将所有替代方案包含在一个非捕获组中,(?:...|...)。此外,为了进一步解决最终的问题,我建议用其环视明确的等效项替换单词边界,(?<!\w)...(?!\w).

这里有一个工作 C# 片段 https://ideone.com/uyQ18s:

var text = "there are big widgets in this phrase blue widgets too";
var words = "big blue widgets";
var pattern = $@"(\s*(?<!\w)(?:{string.Join("|", words.Split(' ').Select(Regex.Escape))})(?!\w)\s*)";
var result = string.Concat(Regex.Split(text, pattern, RegexOptions.IgnoreCase).Select((str, index) =>
            index % 2 == 0 && !string.IsNullOrWhiteSpace(str) ? $"<b>{str}</b>" : str));
 Console.WriteLine(result);

NOTES

  • words.Split(' ').Select(Regex.Escape)- 分裂words带有空格和正则表达式的文本转义每个项目
  • string.Join("|",...)重新构建字符串插入|项目之间
  • (?<!\w)负lookbehind匹配前面没有紧接单词char的位置,并且(?!\w)负向先行匹配后面没有紧跟单词字符的位置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将字符串拆分为单词并与其他数据重新连接 的相关文章

随机推荐

  • 将数组传递给存储过程

    我必须将数组和字符串传递给存储过程并返回数据表 C side public DataTable fetchRequested string empID string account string refNo string orgID str
  • 可以在 Coq 的蕴涵中使用 destruct 吗?

    destruct可以用来分割and or在柯克 不过好像也可以用暗示 例如我想证明 P gt P Lemma test P P gt P Proof unfold not intro pffpf apply pffpf intro pff
  • 如何自动填写XFA(PDF)表格?

    我正在寻找一个免费选项来填写 XFA PDF 表单 我知道 iText 是一个选择 但它们的商业价格对我来说太贵了 我更喜欢完全开源的东西 有 PDFBox 但它似乎不允许将数据插入 XFA 表单 或者至少很少解释如何插入 我只需要使用文本
  • Python字典查找性能,get vs in

    这并不是过早的优化 我的用例在内部循环的最里面对字典的权利进行了双重检查 一直运行 而且 它在智力上也令人厌烦 见结果 这些方法中哪一种更快 mydict hello yes goodbye no key hello A if key in
  • 对 BigIntegers 列表求和

    我已经查看了所有内容 但无法弄清楚这一点 如何对 BigIntegers 列表求和 Using System Numerics Using System Linq List
  • 具有多个组件的开盖

    我正在尝试将三个单元测试项目 三个不同的 dll 合并到一份 OpenCover 报告中 是否可以 我尝试查看过滤器 但在 OpenCover Wiki 站点中没有看到足够的详细信息 示例 有人可以告诉我可以从哪里开始吗 多谢 对的 这是可
  • 错误:无法初始化客户端 | mongo-connect 快速会话

    我在尝试在 mongodb 上保存会话时遇到错误 这是我的代码 const express require express const session require express session const MongoStore req
  • 与 gfortran 和 gcc 静态链接的混合语言

    我有一些用 C 和 Fortran 编写的代码 我想将其编译成静态链接的可执行文件 如果我动态编译代码 使用 fno underscoringgfortran 的选项 一切正常 但是 我想将其链接到 so文件中 静态链接大部分需要的库 然后
  • 从派生的可变参数模板类调用基模板的虚拟方法

    这本质上是后续之前的一个问题 https stackoverflow com q 26351963 315052 不是我提出的 但我对答案感兴趣 问题是 为什么编译器 链接器无法解析派生类对虚函数的调用 在这种情况下 派生类是具有可变参数的
  • C# 强制执行语句的顺序

    我的问题是关于 C 大概还有 Net 中的执行顺序保证 我给出了我所了解的 Java 示例来进行比较 对于Java 来自 Java并发实践 只要在该线程内无法检测到重新排序 就无法保证一个线程中的操作将按照程序给定的顺序执行 即使重新排序对
  • haskell 优雅的方式从无限的数字列表中过滤(减少)重复序列

    这是一个产生无限随机数列表的函数 import System Random values Int values map fst scanl r gen gt randomR 1 10 gen randomR 1 10 mkStdGen 1
  • 使用 FFmpeg 根据其 元数据旋转视频?为什么 Android 会放置错误的元数据?

    我有一个用户上传视频的网站 对于我的网站 我还有一个 Android 应用程序 该网站为每个上传的视频 从浏览器或 Android 创建一个缩略图 问题是对于普通视频来说一切都好 但是对于android我的视频旋转了90 我认为 Andro
  • 在检查条件时消除代码中嵌套 if 的最佳方法是什么?

    我正在用 Java 开发一个 BlackBerry 应用程序 并且有一个存储所有用户设置的选项类 问题是我需要检查一些条件才能知道如何反应 随着我不断添加更多功能 会向用户显示更多 GUI 选项 Options 类中存储更多设置 并且需要检
  • 用逗号分隔

    嘿 我有这个 following user id row following user id 我得到 44443344330 然后我使用 implode 函数并用逗号分隔 44 44 33 44 33 0 但我不想要最后一个数字的最后一个逗
  • 将字典值映射到列表

    给定以下字典 dct a 3 b 3 c 5 d 3 如何将这些值应用于列表 例如 lst c d a b d 为了得到类似的东西 lstval 5 3 3 3 3 Using a 列表理解 https docs python org 3
  • Google 警告:资源解释为 Font,但使用 MIME 类型 application/octet-stream 传输

    我的字体在 Google 中收到警告 资源解释为字体 但使用 MIME 类型 application octet stream 传输 Content Fonts iconFont ttf 即使我有此警告它也有效 但我更愿意避免此警告 这里是
  • Gmail删除链接标签,如何避免这种情况

    我正在尝试使用函数 mail 发送包含链接的富文本 我正在发送这种代码 Please access a href http www site md contact en Contact a to send all these informa
  • 从 SQL 脚本在 H2 数据库中插入长文本

    我正在尝试使用 H2 的 runscript 运行 sql 脚本 其中一个表包含一个长文本类型 用于存储 xml 文档 来自 SAP 数据库 因此 Insert 语句包含较长的 XML 文本 大约 200 行 XML 这相当难看 但仍然可以
  • 如何让 2 个 div 继承父 div 中具有更高高度的 div 的高度?

    我在匹配父 div 内 2 个 div 的高度时遇到问题 我很难解释我是在 Jsfiddle 上做的 http jsfiddle net DSQpd http jsfiddle net DSQpd 基本上 我想做的是匹配高度 无论哪一个更长
  • 将字符串拆分为单词并与其他数据重新连接

    我有一个使用的方法Regex寻找文本中的模式string 它可以工作 但不足以继续下去 因为它需要文本出现在确切的顺序 而不是将短语视为一组单词 public static string HighlightExceptV1 this str