javascript 如何使用正则表达式匹配一个而不是两个字符

8xiog9wr  于 2023-08-02  发布在  Java
关注(0)|答案(4)|浏览(133)

使用JavaScript正则表达式,如何匹配一个字符,同时忽略任何其他匹配的字符?
示例1:我想匹配$,但不匹配$$或$。例2:我想匹配$$,但不匹配$。
正在测试的一个典型字符串是,“$$亚洲意大利语”
从用户体验的Angular 来看,用户选择或取消选择其值与在项目列表中找到的标签相匹配的复选框。必须匹配(选中)所有标签,项目才能显示。

function filterResults(){

// Make an array of the checked inputs
var aInputs = $('.listings-inputs input:checked').toArray();
// alert(aInputs);
// Turn that array into a new array made from each items value.
var aValues = $.map(aInputs, function(i){
    // alert($(i).val());
    return $(i).val();
});
// alert(aValues);
// Create new variable, set the value to the joined array set to lower case.
// Use this variable as the string to test
var sValues = aValues.join(' ').toLowerCase();
// alert(sValues);

// sValues = sValues.replace(/\$/ig,'\\$');
// alert(sValues);

// this examines each the '.tags' of each item
$('.listings .tags').each(function(){
    var sTags = $(this).text();
    // alert(sTags);
    sSplitTags = sTags.split(' \267 '); // JavaScript uses octal encoding for special characters
    // alert(sSplitTags);
    // sSplitTags = sTags.split(' \u00B7 '); // This also works

    var show = true;

    $.each(sSplitTags, function(i,tag){

        if(tag.charAt(0) == '$'){
            // alert(tag);
            // alert('It begins with a $');
            // You have to escape special characters for the RegEx
            tag = tag.replace(/\$/ig,'\\$');
            // alert(tag);
        }           

        tag = '\\b' + tag + '\\b';

        var re = new RegExp(tag,'i');

        if(!(re.test(sValues))){
            alert(tag);
            show = false;
            alert('no match');
            return false;
        }
        else{
            alert(tag);
            show = true;
            alert('match');
        }
    });

    if(show == false){
        $(this).parent().hide();
    }
    else{
        $(this).parent().show();
    }

});

// call the swizzleRows function in the listings.js
swizzleList();
}

字符串
提前感谢!

p4rjhz4m

p4rjhz4m1#

\bx\b

字符串
说明:匹配两个单词边界之间的x(有关单词边界的更多信息,请参阅this tutorial)。\b包含字符串的开始或结束。
我在利用你问题中的空格。如果不存在,那么您将需要一个更复杂的表达式,如(^x$|^x[^x]|[^x]x[^x]|[^x]x$),以匹配可能在字符串的开头和/或结尾的不同位置。这将把它限制为单个字符匹配,而第一个模式匹配整个标记。
另一种方法是将字符串标记化(在空格处拆分),并从标记中构造一个对象,您可以查看给定的字符串是否匹配其中一个标记。这应该比正则表达式的每次查找快得多。

iecba09b

iecba09b2#

就像这样:

q=re.match(r"""(x{2})($|[^x])""", 'xx')

q.groups() ('xx', '')

q=re.match(r"""(x{2})($|[^x])""", 'xxx')

q is None True

字符串

4jb9z9bj

4jb9z9bj3#

我简化到这个。你必须否定双方。我使用的是powershell,但它应该可以在JavaScript中工作。在正则表达式中,美元符号必须用反斜杠转义。

'hi $ hi' | select-string '[^\$]\$[^\$]'

hi $ hi

'hi $$ hi' | select-string '[^\$]\$[^\$]'

# nothing

字符串
实际上,如果美元是唯一的问题,那么就需要更复杂的东西。(Ooo,regex101.com有一个调试器。)我是为.bat文件中的'&'而不是'&&'这样做的,而且'&'不需要反斜杠。

'$' | select-string '(^|[^\$])\$($|[^\$])'

$

'$$' | select-string '(^|[^\$])\$($|[^\$])'

# nothing

e4yzc0pl

e4yzc0pl4#

通常,使用正则表达式,您可以使用(?<!x)x(?!x)来匹配前面或后面都没有xx
使用现代的ECMAScript 2018+兼容的JS引擎,您可以使用基于lookbehind的正则表达式:

(?<!\$)\$(?!\$)

字符串
查看JS演示(仅在supported browsers中运行,其数量正在增长,请查看此处的列表):

const str ="$ $$ $$$ asian italian";
const regex = /(?<!\$)\$(?!\$)/g;
console.log( str.match(regex).length ); // Count the single $ occurrences
console.log( str.replace(regex, '<span>$&</span>') ); // Enclose single $ occurrences with tags
console.log( str.split(regex) ); // Split with single $ occurrences

相关问题