检查文本行中的所有单词是否与RegEx元素(吉他和弦)匹配

时间:2017-09-19 15:39:22

标签: jquery regex

我想实现以下目标:

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

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

即。以下一行:

Am   Bb  C# Dadd9
Song lyrics here

应该成为这个:

<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(形成每个和弦的音符和符号):

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*)+$/;

以下是我为第2步所做的事情:

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> ');
      });

我无法实现步骤1.如何检查文本行是否仅包含RegEx中的注释和符号?

1 个答案:

答案 0 :(得分:1)

答案

我不知道吉他上的和弦是有效/无效的,因为你还没有指明这些信息(明文 - 没有实施正则表达式),我们也不确定你的正则表达式是否有效,我根据我发现的这个随机图表(first result on Google images for list of all guitar chords)得出答案。

enter image description here

正则表达式

样本1

See this regex in use here

根据此图表,我创建了以下正则表达式

library(plotly)
library(shiny)

mtcars$key <- row.names(mtcars)
mtcars$col <- "black"

ui <- fluidPage(
  plotlyOutput("plot")
)

server <- function(input, output, session) {
  output$plot <- renderPlotly({
    click_data <- event_data("plotly_click")
    select_data <- event_data("plotly_selected")
    if (!is.null(select_data)) {
      mtcars[mtcars$key %in% select_data$key, "col"] <- "blue"
    }
    if (!is.null(click_data)) {
      mtcars[mtcars$key %in% click_data$key, "col"] <- "red"
    }
    p <- ggplot(mtcars, aes(mpg, wt, col = I(col), key = key)) + 
      geom_point()
    ggplotly(p) %>% layout(dragmode = "lasso")
  })
}

shinyApp(ui, server)

在这个正则表达式中,我根据和弦定义了群组&#39;首字母(例如(?(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_X代表和弦,即X)。定义的组C是每个和弦之间的比较(例如chordsChord A或......)。最终的正则表达式使用Chord B。此正则表达式确保在和弦之前存在单词边界字符(每个字符以字母开头,因此不会失败),后跟空格(?<link>\b(?&chords)(?=\s|$))或字符串结尾({ {1}}不能在这里使用,因为一些注释包括单词边界字符 - 例如$,因此,为了正确捕获这些实例,我们使用空格或EOF)。

样本2

See this regex in use here

请注意,由于图片中不存在\b(除非我是盲人),否则它不会从您的输入中捕获#。您可以使用以下正则表达式来更改此行为(仅在C#已定义的组中的C#末尾添加?

\#(?:m[67]?|dim)

换人

chord_C

替换从我们的正则表达式(?(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 href="example.com/${link}">${link}</a>

样本1 - 输出

link

样本2 - 输出

Am   Bb  C# Dadd9
Song lyrics here

修改

由于javascript没有使用PCRE正则表达式,因此您不能像上面所说的那样使用命名捕获组,因此,不幸的是,我们将不得不使用漂亮的长而不可读的正则表达式作为如下...

<a href="example.com/Am">Am</a>   <a href="example.com/Bb">Bb</a>  C# Dadd9
Song lyrics here

<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 作为替代。