首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查文本行中的所有单词是否符合RegEx元素(吉他和弦)

检查文本行中的所有单词是否符合RegEx元素(吉他和弦)
EN

Stack Overflow用户
提问于 2017-09-19 15:39:22
回答 1查看 1.8K关注 0票数 1

我要做到以下几点:

1)检查文本行中的每个单词(本例中为吉他和弦)是否包含在RegEx中。所有单词/字符必须匹配。

2)如果是,我希望该行中的每个单词都成为一个链接,指向由该词本身定制的URL。

即,以下一行:

代码语言:javascript
复制
Am   Bb  C# Dadd9
Song lyrics here

应该变成这样:

代码语言:javascript
复制
<a href="example.com/Am">Am</a>   <a href="example.com/Bb">Bb</a>  <a href="example.com/C#">C#</a> <a href="example.com/Dadd9">Dadd9</a>
Song lyrics here

我的RegEx (每个和弦的音符和符号):

代码语言:javascript
复制
var lineRegex = /^\s*(?:(A|B|C|D|E|F|G|A#|C#|D#|F#|G#|Ab|Bb|Db|Eb|Gb){1}(?:m|\+|\-|aug|dim|add|b|#|1|2|3|4|5|6|7|8|9|0|\/)*\s*)+$/;

下面是我为第二步所做的介绍:

代码语言:javascript
复制
var text = $('.input').val();   //get text
var lines = text.split('\n');   //split text into lines
var chords = lines.split(' ');  //split lines into chords

var link = "http://www.example.com/";
      $.each(chords, function(index, value) {   //append link to chord
        $('.output').append('<a href="' + link + value + '">' + value + '</a> ');
      });

我无法完成第一步。如何检查文本行是否只包含来自RegEx的注释和符号?

EN

回答 1

Stack Overflow用户

发布于 2017-09-19 17:09:55

回答

简介

我不知道什么和弦在吉他上是有效的/无效的,因为你没有指定那个信息(用明文-没有实现正则表达式),而且我们也不确定你的正则表达式是否有效,所以我的答案是基于我找到的随机图表(Google图像的第一个结果)。

正则表达式

样本1

参见这里使用的这个正则表达式

基于这个图表,我创建了以下正则表达式

代码语言:javascript
复制
(?(DEFINE)
  (?<chord_A>A(?:b(?:[679+]|sus)?|m[67]?|[689]|maj7|dim|\+|sus)?)
  (?<chord_B>B(?:b(?:[679+]|sus|m[67]?|maj7|dim)?|m[67]?|[679+]|maj7|dim|sus)?)
  (?<chord_C>C(?:[679+]|m[67]?|maj7|dim|sus|\#(?:m[67]?|dim))?)
  (?<chord_D>D(?:b(?:[679+]|maj7|sus)?|[679]|m[67]?|maj7|dim|\+|sus)?)
  (?<chord_E>E(?:b(?:[679+]|sus|m[67]?|maj7|dim)?|m[67]?|[679+]|maj7|dim|sus)?)
  (?<chord_F>F(?:[679+]|m[67]?|maj7|dim|sus|\#(?:[79]|m[67]|dim)?)?)
  (?<chord_G>G(?:b(?:maj7|sus|[6+])?|[679+]|m[67]?|maj7|dim|sus|\#(?:m[67]?|dim))?)
  (?<chords>(?&chord_A)|(?&chord_B)|(?&chord_C)|(?&chord_D)|(?&chord_E)|(?&chord_F))
)
(?<link>\b(?&chords)(?=\s|$))

在这个正则表达式中,我根据和弦的起始字母(例如A)来定义组。

此正则表达式通过定义每个chord的所有可能实例来工作(在每个组chord_X中,X表示chord,即C)。定义的组chords是每个和弦之间的比较(例如Chord AChord B或.)。最终的正则表达式使用(?<link>\b(?&chords)(?=\s|$))。这个正则表达式确保一个单词边界字符存在于和弦之前(每个字符以一个字母开头,因此不会失败),并且后面跟着一个空格或字符串$的末尾(\b不能在这里使用,因为有些注释包括单词边界字符,例如#,因此,为了正确捕获这些实例,我们使用空格或EOF)。

示例2

参见这里使用的这个正则表达式

注意,由于图像中不存在C# (除非我是盲人),所以它不会从输入中捕获C#。您可以使用下面的regex来改变这种行为(它只是在?定义的组中的\#(?:m[67]?|dim)末尾添加了一个chord_C

代码语言:javascript
复制
(?(DEFINE)
  (?<chord_A>A(?:b(?:[679+]|sus)?|m[67]?|[689]|maj7|dim|\+|sus)?)
  (?<chord_B>B(?:b(?:[679+]|sus|m[67]?|maj7|dim)?|m[67]?|[679+]|maj7|dim|sus)?)
  (?<chord_C>C(?:[679+]|m[67]?|maj7|dim|sus|\#(?:m[67]?|dim)?)?)
  (?<chord_D>D(?:b(?:[679+]|maj7|sus)?|[679]|m[67]?|maj7|dim|\+|sus)?)
  (?<chord_E>E(?:b(?:[679+]|sus|m[67]?|maj7|dim)?|m[67]?|[679+]|maj7|dim|sus)?)
  (?<chord_F>F(?:[679+]|m[67]?|maj7|dim|sus|\#(?:[79]|m[67]|dim)?)?)
  (?<chord_G>G(?:b(?:maj7|sus|[6+])?|[679+]|m[67]?|maj7|dim|sus|\#(?:m[67]?|dim))?)
  (?<chords>(?&chord_A)|(?&chord_B)|(?&chord_C)|(?&chord_D)|(?&chord_E)|(?&chord_F))
)
(?<link>\b(?&chords)(?=\s|$))

替换

代码语言:javascript
复制
<a href="example.com/${link}">${link}</a>

该替换引用regex link中的命名捕获组。

结果

输入

代码语言:javascript
复制
Am   Bb  C# Dadd9
Song lyrics here

样本1-输出

代码语言:javascript
复制
<a href="example.com/Am">Am</a>   <a href="example.com/Bb">Bb</a>  C# Dadd9
Song lyrics here

样本2-输出

代码语言:javascript
复制
<a href="example.com/Am">Am</a>   <a href="example.com/Bb">Bb</a>  <a href="example.com/C#">C#</a> Dadd9
Song lyrics here

编辑

由于javascript不使用PCRE regex,所以不能像上面所建议的那样使用命名捕获组,因此,不幸的是,我们将不得不使用一个漂亮的长且不可读的正则表达式,如下所示.

代码语言:javascript
复制
(\b(?:(?:A(?:b(?:[679+]|sus)?|m[67]?|[689]|maj7|dim|\+|sus)?)|(?:B(?:b(?:[679+]|sus|m[67]?|maj7|dim)?|m[67]?|[679+]|maj7|dim|sus)?)|(?:C(?:[679+]|m[67]?|maj7|dim|sus|\#(?:m[67]?|dim)?)?)|(?:D(?:b(?:[679+]|maj7|sus)?|[679]|m[67]?|maj7|dim|\+|sus)?)|(?:E(?:b(?:[679+]|sus|m[67]?|maj7|dim)?|m[67]?|[679+]|maj7|dim|sus)?)|(?:F(?:[679+]|m[67]?|maj7|dim|sus|\#(?:[79]|m[67]|dim)?)?)|(?:G(?:b(?:maj7|sus|[6+])?|[679+]|m[67]?|maj7|dim|sus|\#(?:m[67]?|dim))?))(?=\s|$))

<a href="example.com/$1">$1</a>作为替代。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46304560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档