根据字符串的偏移值将字符串拆分为多个部分

2024-02-01

下面是文本,我想根据以下内容分为多个部分offset & length.

您有疑问或意见并希望联系 ABC 吗? 请访问我们的客户支持页面。

下面是根据文本提取文本的函数offset & length.

  let offset = '83';
  let length = '16';   

  getText(offset, length, text: string) {
    return text.substr(offset, length);
  }

上面的函数返回,customer support.

那么实际问题

我必须分开before & after字符串的文本。像下面这样的东西例如

text1:您有疑问或意见并希望联系 ABC 吗?请访问我们的

文本2:客户支持

文本3:页面

这能实现吗?


您可以将此问题建立在相关问题的基础上,breakAt它在多个切割点处分割字符串。这可以建立在将列表变成其连续对的列表的基础上。 (那是,[2, 3, 5, 7] => [[2, 3], [3, 5], [5, 7]].) 这两个函数都可以在您的应用程序中具有其他合理的用途。

这是一个以这种方式构建的实现:

const intoPairs = xs => xs.slice(1).map((x, i) => [xs[i], x])
const breakAt = (places, str) => intoPairs([0, ...places, str.length]).map(
  ([a, b]) => str.substring(a, b)
)
const getText = (offset, length, str) => breakAt([offset, offset+ length], str)

const str = "Do you have questions or comments and do you wish to contact ABC? Please visit our customer support page."
console.log(getText(83, 16, str))

我不太清楚您首选的输出格式是什么。这只是根据您的情况生成一个包含之前、之内和之后文本的数组offset, length, and str.


Update

后续评论询问如何分解多个子字符串。这正是这种轻微概括的目的。该版本建立在breakAt编写一个接受多个的新函数offset/length配对以便进一步分解单词。它不会尝试处理重叠的可能性;那将是呼叫者的监视。但确实如此,请对这些对进行排序,以便您不必按顺序提供它们。

const intoPairs = xs => xs.slice(1).map((x, i) => [xs[i], x])
const breakAt = (places, str) => intoPairs([0, ...places, str.length]).map(
  ([a, b]) => str.substring(a, b)
)
const breakWhere = (words, str) => breakAt(
  words.slice(0).sort(({offset: o1}, {offset: o2}) => o1 - o2).reduce(
    (a, {offset, length}) => [...a, offset, offset + length],
    []
  ),
  str
)

const str = "Do you have questions or comments and do you wish to contact ABC? Please visit our customer support page."

console.log(breakWhere([
  {offset: 83, length: 16}, // "customer support"
  {offset: 12, length: 9},  // "questions"
  {offset: 25, length: 8},  // "comments"
], str))

The slice调用只是为了避免改变列表offset/length对。如果不担心的话,你可以放弃它。

另一个更新

另一个后续评论(这个问题的最后一个,@stacks;下次开始一个新问题!)询问如何将输出格式化为跟踪纯文本与链接文本的节点。这是一个相当幼稚的版本:

const intoPairs = xs => xs.slice(1).map((x, i) => [xs[i], x])
const breakAt = (places, str) => intoPairs([0, ...places, str.length]).map(
  ([a, b]) => str.substring(a, b)
)
const breakWhere = (words, str) => breakAt(
  words.reduce((a, {offset, length}) => [...a, offset, offset + length], []),
  str
)

const createNodes = (links, str) => {
  const sortedLinks = links.slice(0).sort(({offset: o1}, {offset: o2}) => o1 - o2)

  return breakWhere(sortedLinks, str).map((s, i) => i % 2 == 0 
    ? {data: s, type: 'text'}
    : {data: s, type: 'link', path: sortedLinks[(i - 1) / 2].path}
  ).filter(({data}) => data.length > 0)
}

const str = "Do you have questions or comments and do you wish to contact ABC? Please visit our customer support page."

const links = [
//  {offset: 0, length: 6, path: '/path/to/doYou'},
  {offset: 83, length: 16, path: '/path/to/custSupport'},
  {offset: 12, length: 9, path:  'path/to/questions'},
  {offset: 25, length: 8, path:  'path/to/comments'},
]


console.log(createNodes(links, str))

这将早期调用的简化版本包装为将备用字符串映射到的版本type: 'text' and type: 'link'对象,每个对象都有一个data财产。这些链接还给出了path. That path可能不适用于您的数据,您可以在代码中跳过它。

The filter最后的调用是删除可能为空的文本节点。如果两个链接相邻,或者如果字符串的开头或结尾有一个链接,则将存在一个空节点。您可以通过取消注释额外的内容来看到这一点link。如果您删除filter调用,这将留下一个初始的空文本节点,可能不是我们想要的。

我称这个版本为幼稚的,因为它不处理多种可能性,最重要的是重叠部分。这似乎有点困难,而且对于您的项目来说可能永远不需要。

Note

这种方法的一个重要的事情是它layered。我们不是尝试编写一个一次性完成所需所有事情的函数,而是构建辅助函数。intoPairs and breakAt两者本身可能都有用。breakWhere and createNodes可能更具体地解决这个问题。我建造了createNodes已经创建了breakWhere。将新功能分层在旧功能之上非常简单。

换句话说,设计本身就包含了一些需求变化的历史。它在性能方面可能不是最佳的,不是因为有任何严重缺陷,而只是因为它最初创建时没有考虑到最终要求。有时值得回过头来重新思考这样的代码,但这并不总是重要的。您必须决定所使用的附加循环是否对您的应用程序来说是一个严重的问题,或者您是否只需要分层较少的代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据字符串的偏移值将字符串拆分为多个部分 的相关文章

随机推荐

  • 强制删除 boost::signals2 中的槽

    我发现 boost signals2 使用某种连接槽的惰性删除 这使得很难使用连接来管理对象的生命周期 我正在寻找一种方法来强制在断开连接时直接删除插槽 任何有关如何通过以不同方式设计我的代码来解决问题的想法也将受到赞赏 这是我的场景 我有
  • 在 FluentAssertions 中自定义失败处理

    我尝试使用 FluentAssertions 不仅作为测试断言框架 而且还检查运行时契约 例如高级 Debug Assert 并且我已阅读this https stackoverflow com questions 49724379 sho
  • 空手道 - 如何在 java 文件中使用 karate-config.js 变量?

    我有一个 DB utils java 文件 我需要根据运行代码的环境加载数据库用户名密码 并且需要从 karate config js 导入这些环境值 如何实现这一目标 只需使用嵌入表达式即可 所以如果你有dbusername and db
  • Python 多处理:如何在错误后干净地退出?

    我正在编写一些使用的代码multiprocessing模块 然而 由于我是新手 经常发生的情况是弹出一些错误 导致主应用程序停止运行 但是 该应用程序的子级仍然保持运行 并且我得到一长串正在运行的列表pythonw我的任务管理器列表中的进程
  • 在 varchar 列中查找非数字值

    要求 通用查询 函数 用于检查表中 varchar 列中提供的值是否实际上是数字且精度不超过允许的精度 可用值 表名称 列名称 允许的精度 允许的小数位数 一般建议是创建一个函数并使用 to number 来验证该值 但它不会验证允许的长度
  • 如何在 Android 键盘上添加“下一步”

    我在某些应用程序中看到键盘中出现一个名为 next 的按钮 它将焦点放在下一个编辑文本上 我想将其添加到我的应用程序中 你知道我该怎么做吗 或者它仅在应用程序的键盘上 多谢 抱歉 我没有这方面的更多信息 在edittext的布局中添加and
  • C/C++ 中结构体的字段对齐

    结构体的成员是用 C C 封装的吗 我所说的打包是指它们是紧凑的 并且字段之间没有内存空间 这不是对齐的意思 并且不保证任何特定的对齐或打包 元素将按顺序排列 但编译器可以在其选择的位置插入填充 这其实creates 有用的 对齐 例如 对
  • Angular 服务与导出

    我有一组简单的工具方法 没有任何状态可以在应用程序中共享 不需要是单例 也不需要任何注入的服务 使用注射服务有什么优势吗 Injectable export class DateService public convertStringToD
  • SDL 错误架构 x86_64“_SDL_main”的未定义符号

    我在 mac os x 上将 C 与 SDL Cocoa 和 Foundation 框架结合使用 我收到以下错误 Undefined symbols for architecture x86 64 SDL main referenced f
  • 如何在 Jekyll / Github 页面站点的 config.yml 中的新选项卡中打开 URL?

    我是自学成才 对 Jekyll 和 Github Pages 完全陌生 并且想知道如何在 config yml 页面中使用 markdown 在新选项卡中打开 URL This https aweekj github io Kiko plu
  • 添加不同的形状到 d3 力布局

    我试图将不同的形状添加到我的 d3 力布局中 但没有成功 最终目标是根据节点对象本身的属性确定形状 我使用 Selection enter 然后 append 形状像这样 由于力导向布局仅采用一组节点 而 append 采用字符串而不是函数
  • PostgreSQL:创建索引以快速区分NULL和非NULL值

    考虑具有以下内容的 SQL 查询WHERE谓词 WHERE name IS NOT NULL Where name是 PostgreSQL 中的文本字段 没有其他查询检查该值的任何文本属性 只是检查它是否是NULL或不 所以 完整的 btr
  • 如何在 Visual Studio 2012 中创建/打开 DAC 应用程序?

    我很难弄清楚如何使用 Visual Studio 2012 实际创建甚至打开 DAC 应用程序 我使用的是 SQL Server 2012 我安装了 SSDT 从 Visual Studio 创建 根据在线文档 我应该能够看到名为 数据层应
  • Android Studio 3.1:编辑器中错误的未解析引用

    我正在运行 Ubuntu 17 10 并且刚刚更新安卓工作室从版本 3 0 1 到 3 1 以下是 帮助 gt 关于 中的版本信息 Android Studio 3 1 Build AI 173 4670197 built on March
  • Spark DataFrame 的 SparkRcollect() 和 head() 错误:参数意味着行数不同

    我从 HDFS 系统读取了 parquet 文件 path lt hdfs part 2015 AppDF lt parquetFile sqlContext path printSchema AppDF root app binary n
  • 嵌套类会产生什么后果? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有这个示例代码 带有一个类B嵌套在类内部A class A class B count 0 def init self b1 None b2
  • 使用 CORS 和 IE9 的 ASP Web API POST 请求(XDomainRequest 对象)

    我一直在疯狂地尝试让 jquery ajax 与 ie9 一起工作 所以我有一个实现 CORS 的 ASP Web API 2 Rest API 来自所有浏览器的 CORS 请求都有效 IE9 无法工作 因为它使用 XDomainReque
  • 错误:ConnectionResult{statusCode=INTERNAL_ERROR,分辨率=null}

    我正在开发应用程序 将 Google Drive 集成到我的应用程序中 下面是我的代码 我只是从示例代码中复制而来 但在连接 Google Drive 时出现异常 例外 ConnectionResult statusCode INTERNA
  • 如何使用给定的装饰器获取Python类的所有方法?

    如何获取给定类 A 的所有用 decorator2 class A def method a self pass decorator1 def method b self b pass decorator2 def method c sel
  • 根据字符串的偏移值将字符串拆分为多个部分

    下面是文本 我想根据以下内容分为多个部分offset length 您有疑问或意见并希望联系 ABC 吗 请访问我们的客户支持页面 下面是根据文本提取文本的函数offset length let offset 83 let length 1