正则表达式:理解音节计数器代码

2023-12-26

我用过迪伦的问题 https://stackoverflow.com/questions/5686483/how-to-compute-number-of-syllables-in-a-word-in-javascript这里关于 JavaScript 音节计数,更具体地说巧妙黑客的回答 https://stackoverflow.com/a/8843915,在我自己的代码中,无论我输入哪个单字或多字字符串,该函数始终能够正确计算音节数。

我对正则表达式的经验有限,并且没有足够的先验知识,无法在没有帮助的情况下破译以下代码中到底发生了什么。我不是那种乐于从某个地方提取的代码在我不知情的情况下工作的人how有用。有人能够阐明正在发生的事情吗new_count(word)下面的函数帮助我破译 RegEx 的使用以及该函数如何能够正确计算音节?许多

function new_count(word) {
  word = word.toLowerCase();                                     //word.downcase!
  if(word.length <= 3) { return 1; }                             //return 1 if word.length <= 3
  word = word.replace(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/, '');   //word.sub!(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/, '')
  word = word.replace(/^y/, '');                                 //word.sub!(/^y/, '')
  return word.match(/[aeiouy]{1,2}/g).length;                    //word.scan(/[aeiouy]{1,2}/).size
}

据我所知,我们基本上想要计算元音或元音对,以及一些特殊情况。让我们从最后一行开始,它的作用是计算元音和元音对:

return word.match(/[aeiouy]{1,2}/g).length;

这将匹配任何元音或元音对。[...]意味着一个字符类 http://www.regular-expressions.info/charclass.html,也就是说,如果我们逐个字符地遍历字符串,如果实际字符是其中之一,我们就会得到一个匹配项。{1, 2}是的数量重复 http://www.regular-expressions.info/repeat.html,即这意味着我们应该精确匹配一个或两个这样的字符。

另外两行用于特殊情况。

word = word.replace(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/, '');

此行将从单词末尾删除“音节”,它们是:

  • Xes(其中X不是以下任何一个 'laeiouy',例如'zes')
  • ed
  • Xe(其中X不是以下任何一个 'laeiouy',例如'xe')

(我不太确定这背后的语法含义是什么,但我猜,单词末尾的“音节”,如“-ed”、“-ded”、“-xed”等,并不真正意味着什么。如此算。) 至于正则表达式部分:(?:...) is a 非捕获组 http://www.regular-expressions.info/brackets.html。我想在这种情况下,这个小组是不是真的不重要非捕获;这仅意味着我们想要对整个表达式进行分组,但随后我们不需要返回引用它。但是,我们也可以使用捕获组(即(...) )

The [^...]是一个否定的字符类。这意味着匹配任何字符,但此处未列出任何字符。 (与上面提到的(非否定)字符类进行比较。) 管道符号,即|, 是个交替 http://www.regular-expressions.info/alternation.html运算符,这意味着任何表达式都可以匹配。 最后,$锚点匹配队伍的尽头 http://www.regular-expressions.info/anchors.html,或字符串(取决于上下文)。

word = word.replace(/^y/, '');

这行从单词的开头删除了“y”-s(开头的“y”可能不算作音节——我认为这是有道理的)。^是匹配的锚点行的开头 http://www.regular-expressions.info/anchors.html,或字符串(参见$上文提到的)。

注意:该算法仅在以下情况下有效word确实包含一个单词。

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

正则表达式:理解音节计数器代码 的相关文章

  • 位置特征检测:固定

    我正在尝试找到一个脚本来检测设备是否放置position fixed元素相对于视口而不是整个文档 目前 标准桌面浏览器和 Mobile Safari 适用于 iOS 5 都是这样做的 而 Android 设备则相对于整个文档放置固定元素 我
  • 使用 Angular 指令禁用文本选择

    我正在学习 JavaScript 和 AngularJS 我想使用 Angular Directive 禁用文本选择 我有该函数的 JavaScript 代码 function clearSelection if document sele
  • 使用 Node.js 构建网站的最佳实践

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我想知道如何使用 Node js 从头开始 开发一个网站 我明白我怎么能possibly
  • 如何使用 Playwright 使用选择器查找框架 (iframe)

    我有一个小问题 无法找到使用 Microsoft Playwright 框架的答案 根据您可以使用以下代码获取 iframe const frame page frame frame login 但是如何使用选择器来查找 iframe 并与
  • 通过 JavaScript 获取表单名称

    我有一个简单的问题 但我在网上找不到好的解决方案 我有这个 HTML 代码
  • 如何使用javascript确保元素仅在圆上朝一个方向移动?

    好吧 我承认我对三角学真的很糟糕 出于上下文的考虑 我将添加我在这里提到的问题中的内容 参考问题 https stackoverflow com a 39429290 168492 https stackoverflow com a 394
  • 如何在网站上使用 svg 元素制作块的屏幕截图?

    我在网站上创建了一个构造函数 其本质是将所选元素及其颜色 svg中的元素 添加到访问者选择的背景和背景颜色 png中的背景 中 然后必须单击 保存 结果 按钮并仅执行工作区的屏幕截图 我写了这个脚本 但它需要屏幕截图 但只有背景 并忽略选定
  • Java AES 128 加密方式与 openssl 不同

    我们遇到了一种奇怪的情况 即我们在 Java 中使用的加密方法会向 openssl 生成不同的输出 尽管它们在配置上看起来相同 使用相同的键和 IV 文本 敏捷的棕色狐狸跳过了懒狗 加密为 Base64 字符串 openssl A8cMRI
  • React autoFocus 将光标设置为输入值的开头

    我有一个受控输入 最初显示一个值 我已将该输入设置为自动聚焦 但当我希望它出现在末尾时 光标出现在输入的开头 我知道这可能是因为自动对焦是在值之前添加的 但我不能 100 确定 在输入字段末尾完成光标初始化的最佳方法是什么 var Test
  • JavaScript推送函数中的动态变量

    我在 JavaScript 中使用推送功能 var chartData for var i 0 i lt 3 i chartData push date new Date year s mon s date s hr s min s sec
  • 计算三次贝塞尔曲线的弧长、曲线长度。为什么不工作?

    我正在用这个算法计算弧长 三次贝塞尔曲线的长度 function getArcLength path var STEPS 1000 gt precision var t 1 STEPS var aX 0 var aY 0 var bX 0
  • 将 Firebase 云消息传递与 Windows 应用程序结合使用

    我在 Android 和 iOS 应用程序中使用 Firebase Cloud Messaging 但是我还有此应用程序的 Windows Mac OS 版本 我想保留相同的逻辑 我知道 Firebase Cloud Messaging 可
  • 检查条件并通过 Zend 中的 Regex 识别 url 中的模式

    我正在实现 Zend Regex 路由 并且必须对 url 执行多次检查 例如 如果这是我的网址 http localhost application public index php module controller action 这是
  • 如何使用 JavaScript 或 jQuery 克隆 HTML 元素的样式对象?

    我正在尝试克隆元素的样式对象 这应该允许我在更改后重置所述元素的样式 例如 el style left 50px curr style left 50px Modify the elements style The cloned style
  • $resource.query 返回分割字符串(字符数组)而不是字符串

    我正在使用像下面这样的 Angular resource angular module app factory data function resource var Con resource api data update method P
  • 滚动顶部不符合预期

    Note 由于上次忘记奖励而重新开放赏金 A Woff 大师已经给出答案 我想在用户展开某一行时到达该行 这样当最后一个可见行展开时 用户不必向下滚动即可查看内容 I used example tbody on click td green
  • Flot 库将 y 轴设置为最小值 0 和最大值 24

    如何将 y 轴设置在 0 到 24 的范围内 这是我的代码 j plot j placeholder d1 xaxis mode time min new Date 2010 11 01 getTime max new Date 2011
  • 如何从 json 文件创建模型? (ExtJS)

    这是我想使用 json 文件创建的模型 Ext define Users extend Ext data Model fields name user id type int name user name type string 为了根据服
  • 测量窗口偏移

    有没有一种方法可以测量 jQuery 中窗口的偏移量 以便我可以比较 固定 元素和相对定位元素的位置 我需要能够知道窗口滚动了多远 以便我可以使用该图来计算固定元素的高度 相对于视口顶部 和相对对象的高度 相对于顶部 之间的差异文件的内容
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对

随机推荐

  • linux/unix 下是否有与 WinAPI 的 MAX_PATH 等效的东西?

    如果我想分配一个保证足够大以容纳任何有效的绝对路径 文件名的字符数组 在C中 那么它需要有多大 在 Win32 上 有 MAX PATH 定义 Unix linux 的等价物是什么 有一个PATH MAX 但是有点问题 来自错误部分真实路径
  • UIAutomation:在没有实际执行的情况下点击警报视图上的取消按钮

    我在 UIAutomation 中面临这个奇怪的问题 我正在检查警报 在其中 我试图记录警报标题和警报消息 我的代码是 UIATarget onAlert function onAlert alert UIALogger logMessag
  • 将文本文件写入 blob 时无法保留换行符

    我有一个文本区域 其中包含我想要输出到文本文件以供用户下载的文本 当用户单击 保存 按钮时 我使用此功能来获取它 function saveTextAsFile var textToWrite document getElementById
  • NodeJS 中的提示模块重复输入

    我正在使用 NodeJS 及其 CLI 应用程序创建一个应用程序 为了获取用户的输入 我使用 提示 模块 我可以使用它 但是在输入提示符时 每个字符都会重复 但是输出很好 代码如下 请帮忙 prompt start prompt get p
  • 使用身份主键将新实体插入到上下文中

    我想将一条新记录插入到我的 SQL 表中 我试过 public void CreateComment int questionId string comment QuestionComment questionComment context
  • 如何删除Github上和本地的最后n次提交?

    我正在尝试从我的 GitHub 存储库之一删除最后 2 次提交 我已经按照建议尝试了here https stackoverflow com questions 448919 how can i remove a commit on git
  • Yesod、WebSockets 和持久性

    我正在尝试在 Haskell 中实现一个基于回合的游戏的服务器 我的选择是使用 Yesod 进行管理和元信息 例如 用户参与哪些游戏等 我想使用网络套接字来保持游戏内数据开销较小 看看 ws chat 示例 我不确定如何访问 Handler
  • lockCanvas 不断抛出异常

    我从 opencv4android 人脸检测 复制了示例代码 我通过了NDK部分 并在手机上运行该应用程序 然而 SurfaceView 仅显示相机预览 看来 OnCameraFrame 中所做的任何操作都不会影响 SurfaceView
  • C# - 使用反射比较两个 .net dll

    我想比较位于不同位置的两个相同的 net dll 因此 我使用加载 dllSystem Reflection Assembly LoadFile filename 代替System Reflection Assembly LoadFrom
  • Pod 文件中的“平台”指的是什么?

    当你在顶部创建一个新的 pod 文件时 会有 platform ios 9 0 我应该将此 平台 值设置为我的项目的部署目标吗 它指定您要支持 pod 项目的最低操作系统版本 如果您的应用程序项目的部署目标低于提到的 pod 项目的 iOS
  • ThreadPoolExecutor:: 来自执行器的 TaskRejectedException

    我的应用程序正在通过 Jms MessageListener 类读取消息 并且在某个时间点它会抛出异常任务拒绝异常 我知道你们大多数人都会说线程数超出了最大池大小而且队列也满了 但我观察到一些事情 发送到 MessageListener 类
  • 创建与数据库表同名的缓冲区

    我在很多地方都遇到过这段代码 DEFINE BUFFER Customer FOR Customer 我有两个问题 这样做的目的是什么 为什么创建与表同名的缓冲区是有益的 当编写代码访问该表 缓冲区时 Progress 如何知道是直接访问
  • Foreman 不使用 NGINX

    我正在尝试使用Foreman https github com ddollar foreman 版本 0 31 0 来管理我们应用程序的进程 但我对 nginx nginx 1 0 10 Phusion Passenger 3 0 11 的
  • 为什么 C 代码中的 1.0f 在生成的程序集中表示为 1065353216?

    在 C 中我有这个代码块 if x 1 a j i 1 else a j i 0 a是一个浮点值矩阵 如果我尝试以 nasm 语法查看此代码的编译程序集 线a j i 0 作业 以这种方式编码 dword rsi rdi 0 但这条线a j
  • Java 中箭头运算符“->”有什么作用?

    在搜索一些代码时 我遇到了箭头运算符 它到底是做什么的 我以为Java没有箭头运算符 return Collection
  • Entity Framework 5 的新迁移功能是否完全支持枚举更改?

    假设我们有以下简单模型 public class Car public int Year get set public string Make get set public string Model get set public CarTy
  • 如何编辑 jquery 函数

    我正在尝试修改 jQuery V 6 1 核心中的 attr 函数 我有一个plugins js 文件 该文件包含在jquery 6 1 js 文件之后的页面中 plugins js 文件包含对各种 jQuery 核心函数的改进 以适应某些
  • Scrapy获取任何网站的所有链接

    我有以下 Python 3 网络爬虫代码 import requests from bs4 import BeautifulSoup import re def get links link return links r requests
  • C++ 使用构造函数参数初始化成员数组

    我有一个模板类 其中包含编译时常量长度的单个成员数组 我希望这个数组是常量 但根据构造函数提供的输入初始化它被证明很困难 struct Input int value template
  • 正则表达式:理解音节计数器代码

    我用过迪伦的问题 https stackoverflow com questions 5686483 how to compute number of syllables in a word in javascript这里关于 JavaSc