简体   繁体   English

正则表达式-仅匹配一次字符-然后忽略

[英]Regex - match character only once - then ignore

I went through a lot of questions and couldn't solve my problem. 我遇到了很多问题,无法解决我的问题。

I need to match a number of special characters, but only once. 我需要匹配多个特殊字符,但只能匹配一次。

HTML: HTML:

 <form class="FillIn Rearrange">
       <input data-correctanswer="ça" type="text">,
       <input data-correctanswer="ça" type="text">
       <input data-correctanswer="vé" type="text">
       <input data-correctanswer="bién" type="text">
</form>

This JS currently returns ALL ç, and é, but I need 1 max. 该JS当前返回ALLç和é,但我最多需要1个。 of each: 每个:

 var buttons = '';
        $('.FillIn input').each(function () {
            var corrAns = $(this).attr('data-correctanswer');


            for (var i = 0; i < corrAns.length; i++) {
                if (corrAns[i].match(/[éç]/g)) {
                    buttons += '<button>' + corrAns[i] + '</button>';
                }
            }
        });

fiddle 小提琴

Currently returns ççéé (all occurrences) 当前返回ççéé(所有情况)

Need it to return çé (one of each). 需要它返回çé(每个)。

Need a scalable solution, ie .match(/[éçdfga]/g) (or any extra letter) 需要一个可扩展的解决方案,即.match(/ [éçdfga] / g)(或任何其他字母)

It looks like you want to end the for loop as soon as you get a match, so throw in a break statement: 看起来您想在获得匹配项后立即结束for循环,因此请输入break语句:

 var buttons = '';
        $('.FillIn input').each(function () {
            var corrAns = $(this).attr('data-correctanswer');


            for (var i = 0; i < corrAns.length; i++) {
                if (corrAns[i].match(/[éç]/g)) {
                    buttons += '<button>' + corrAns[i] + '</button>';
                    break;
                }
            }
        });

You simply need to remember what you have already found and not process it: 您只需要记住已经找到的内容而不进行处理:

var buttons = '';
var found   = []; // this remembers what we have already found

$('.FillIn input').each(function () {

    var corrAns = $(this).attr('data-correctanswer');

    for (var i = 0; i < corrAns.length; i++) {

        var m; // hold the match
        if (m = corrAns[i].match(/[éç]/)) {

            // not found yet
            if(found.indexOf(m[0]) == -1) {

                found.push(m[0]) // remember it's been found
                buttons += '<button>' + corrAns[i] + '</button>';
            }
        }
    }
});

Here's how you can do it: 您可以按照以下方法进行操作:

 var buttons = ''; function createButtons(lettersToMatch){ $('.FillIn input').each(function () { var corrAns = $(this).attr('data-correctanswer'); for (var i = 0; i < corrAns.length; i++) { var match = corrAns[i].match(new RegExp(lettersToMatch)); if (match) { buttons += '<button>' + corrAns[i] + '</button>'; lettersToMatch = lettersToMatch.replace(match[0], ""); } } }); } //Testing createButtons("[éèçêïë]"); $("body").append( buttons ); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <form class="FillIn Rearrange"> <input data-correctanswer="çaï" type="text">, <input data-correctanswer="ça" type="text"> <input data-correctanswer="vé" type="text"> <input data-correctanswer="bién" type="text"> </form> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM