否定前瞻字符串中的额外数字无效

时间:2018-01-18 06:02:35

标签: r regex pcre

我正在尝试在R中编写一个匹配某个字符串的正则表达式,直到发生<RadioButtonGroup valueSelected={this.state.cranRadio} onChange={this.handleCRAN} style={{ display: "flex", flexWrap: "wrap", justifyContent: "space-between" }} name="coin" defaultSelected="not_light" > <RadioButton value="Yes" label="Yes" inputStyle={styles.inputStyle} style={{ width: "auto" }} labelStyle={{ marginLeft: "-10px" }} /> <RadioButton value="No" label="No" style={{ width: "auto" }} inputStyle={styles.inputStyle} labelStyle={{ marginLeft: "-10px" }} /> </RadioButtonGroup>; 的点。我认为负面的预测可能就是答案,但我得到了一些误报。

所以在以下9项矢量

.

grep

vec <- c("mcq_q9", "mcq_q10", "mcq_q11", "mcq_q12",   "mcq_q1.factor", "mcq_q2.factor", "mcq_q10.factor", "mcq_q11.factor", "mcq_q12.factor")

完成向量中前六个元素的工作,匹配grep("mcq_q[0-9]+(?!\\.)", vec, perl = T) "mcq_q11"。不幸的是,当 匹配最后3个元素时,第二个"mcq_q2.factor"后面有两个数字。为什么第二个数字会消除我的负面预测?

4 个答案:

答案 0 :(得分:2)

我认为你希望你的负向前瞻首先扫描整个字符串,确保它看不到“点”:

(?!.*\.)mcq_q[0-9]+

https://regex101.com/r/f5XxR2/2/

答案 1 :(得分:1)

如果要捕捉到一个点,那么你应该使用它:

mcq_q[0-9]+(?![\d\.])

Demo

示例来源(run here

vec <- c("mcq_q9", "mcq_q10", "mcq_q11", "mcq_q12",   "mcq_q1.factor", "mcq_q2.factor", "mcq_q10.factor", "mcq_q11.factor", "mcq_q12.factor")
grep("mcq_q[0-9]+(?![\\d\\.])", vec, perl = T)

答案 2 :(得分:1)

我们可以在没有任何环视的情况下使用它来匹配数字(.)之后不是[0-9]+的零个或多个字符,直到字符串结尾($

grep("mcq_q[0-9]+[^.]*$", vec, value = TRUE)
#[1] "mcq_q9"  "mcq_q10" "mcq_q11" "mcq_q12"

答案 3 :(得分:1)

正如评论中所解释的那样,负面的前瞻是棘手的。但你不需要它

/mcq_q[0-9]+(?:$|[^.0-9])/

这要求一串数字后面跟着字符串结尾或非[.,数字]字符。因此,它将允许mcq_q12a等。如果您的允许字符串只能以数字结尾,请删除|[^...],然后也不需要非捕获组(?:...),{{1} }

仅在Perl中测试,因为问题已被标记。对于R中的示例,它应该是相同的。