如何在令牌之前匹配非字母?

时间:2017-12-29 21:31:39

标签: arrays ruby regex match

我正在使用Ruby 2.4。我对我的RegEx无法正常工作的原因感到非常困惑。我想匹配我的数组中的一个令牌,前提是它不是字母之前的东西。我的数组是

var num1 = 5;
var num2 = 6;
var bigNumber = num1 + 10 * num2;  //65

所以这应该匹配

c = new Container();
c.setLayout(new BoxLayout(2));

for (String s : listOne) {
     c.add(new Label("test"));
}
tb.addComponentToSideMenu(c);


public void test () {

    c.remove(); 

    c = new Container();
    c.setLayout(new BoxLayout(2));

    for (String s : listTwo) {
        c.add(new Label("test 2"));
    }

    tb.addComponentToSideMenu(c);
}

应该

2.4.0 :023 > GENDER_TOKENS
 => ["m", "male", "men", "f", "w", "female", "wom"]

但不是

"2f 25"

因为“f”之前的东西不是字母。我以为这样做会......

"f 100"

但它的匹配完全相同。为什么不是“^ \ p {L}]”匹配非字母?

2 个答案:

答案 0 :(得分:3)

我建议您按如下方式编写正则表达式。

r = /(?<!\p{L})#{Regexp.union(GENDER_TOKENS)}(?!\p{L})/
  #=> /(?<!\p{L})(?-mix:m|male|men|f|w|female|wom)(?!\p{L})/

其中显示“与字母不匹配(负面观察),匹配GENDER_TOKENS元素,与字母不匹配(负向前瞻)”。

"2f 25".match?(r)      #=> true
"2f25".match?(r)       #=> true
"2female".match?(r)    #=> true
"male 100".match?(r)   #=> true
"elf 25".match?(r)     #=> false
"2funky 25".match?(r)  #=> false

请注意,需要消极前瞻。如果我们使用正则表达式

rr = /(?<!\p{L})#{Regexp.union(GENDER_TOKENS)}/
  #=> /(?<!\p{L})(?-mix:m|male|men|f|w|female|wom)/

我们可以获得错误的结果,例如

"2funky 25".match?(rr) #=> true

(因为令牌"f"已匹配)。

答案 1 :(得分:2)

由于双引号,p似乎丢失之前的反斜杠。

我不太了解红宝石,但我可以查看here