javascript 在正则表达式语句内部传递动态值不起作用?[duplicate]

qnzebej0  于 2023-01-29  发布在  Java
关注(0)|答案(1)|浏览(114)
    • 此问题在此处已有答案**:

Template literal inside of the RegEx(2个答案)
昨天关门了。
我在输入字段上设置了一个验证规则,它最多允许键入三个单词,我使用正则表达式规则(/^\s*(?:\S+(?:\s+\S+){0,2}\s*)?$/)来验证这一点。
现在我不想硬编码这个最大值3,然后像{0, 2}这样使用它,所以我动态地传递这个值,然后在正则表达式中使用它,但是正则表达式不能正常工作,我也不知道它的语法是否正确。
我尝试了以下语法,但没有任何效果-

1. `${/^\s*(?:\S+(?:\s+\S+){0,${max-1}}\s*)?$/}`

2. /`${^\s*(?:\S+(?:\s+\S+){0,${max-1}}\s*)?$}`/

3. new RegExp(`${/^\s*(?:\S+(?:\s+\S+){0,${max-1}}\s*)?$/}`)

我也试着研究类似的问题,但运气不佳。
下面是一个使用硬编码正则表达式和动态正则表达式的示例。

    • 测试问题的步骤-**

1.尝试在第一次输入中键入3个以上的单词,它应该会抛出错误"Max 3 words are allowed"。(工作正常)
1.尝试在第二个输入中键入任何内容,它将从一开始就抛出错误。(不工作)

<!DOCTYPE html>
<html>
  <head>
    <link href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css" rel="stylesheet">
  </head>
  <body>
    <div id="app">
      <v-app>
        <h3>
        Hardcoded Max Limit (Working)</h1>
        <v-text-field
          v-model="queryH"
          :rules="[rules.maxWordsH()]"
          dense
          ></v-text-field>
        <h3 class="red--text">
        Dynamic Max Limit (Not Working)</h1>
        <v-text-field
          v-model="queryD"
          :rules="[rules.maxWordsD(3)]"
          dense
          ></v-text-field>
      </v-app>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>
    <script>
      new Vue({
        el: '#app',
        vuetify: new Vuetify(),
        data() {
          return {
            queryH: null,
            queryD: null,
            rules: {
              maxWordsH() {
                return (v) =>
                  (v || "").match(/^\s*(?:\S+(?:\s+\S+){0,2}\s*)?$/) ?
                  true :
                  "Max " + 3 + " words are allowed";
              },
              maxWordsD(max) {
                return (v) =>
                  (v || "").match(`${/^\s*(?:\S+(?:\s+\S+){0,${max-1}}\s*)?$/}`) ?
                  true :
                  "Max " + max + " words are allowed";
              },
            },
          };
        },
      })
    </script>
  </body>
</html>
krcsximq

krcsximq1#

您可以尝试这样做。当使用构造函数时,常规的字符串转义规则(当特殊字符包含在字符串中时,在特殊字符前面加上\)是必要的。

new RegExp(`^\\s*(?:\\S+(?:\\s+\\S+){0,${max-1}}\\s*)?$`)

相关问题