我想实现以下目标:
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中的注释和符号?
答案 0 :(得分:1)
我不知道吉他上的和弦是有效/无效的,因为你还没有指明这些信息(明文 - 没有实施正则表达式),我们也不确定你的正则表达式是否有效,我根据我发现的这个随机图表(first result on Google images for list of all guitar chords)得出答案。
根据此图表,我创建了以下正则表达式
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
是每个和弦之间的比较(例如chords
或Chord A
或......)。最终的正则表达式使用Chord B
。此正则表达式确保在和弦之前存在单词边界字符(每个字符以字母开头,因此不会失败),后跟空格(?<link>\b(?&chords)(?=\s|$))
或字符串结尾({ {1}}不能在这里使用,因为一些注释包括单词边界字符 - 例如
$
,因此,为了正确捕获这些实例,我们使用空格或EOF)。
请注意,由于图片中不存在\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>
link
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
作为替代。