我正在使用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}]”匹配非字母?
答案 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。