验证单词开头的两个星号



需要验证一个单词的开头是否有一个或最多两个星号,从三个开始,它应该忽略它们。

数:

[
'* 11 13 24.574 1,474.79'
'** 11 13 24.574 1,474.79'
'*** 11 13 24.574 1,474.79'
]

测试

1. ^[**]
2. ^[*][*]
3. (^*{1}s)
4. ^*|*s

预期

[
'* 11 13 24.574 1,474.79',
'** 11 13 24.574 1,474.79'
]

当你说单词时,我会假设你有一个向量中列出的所有"单词"。这应该看起来像:

string_vector <- c("* 11 13 24.574 1,474.79", "** 11 13 24.574 1,474.79", "*** 11 13 24.574 1,474.79")

测试 1 的问题是 [] 选择括号内的任一元素,因此 ^[**] 只在字符串开头搜索一个星号。所有 3 个单词都将匹配。测试 2 将匹配开头有 2 个星号的任何情况,其中包括向量中的所有 3 个字符串。测试 3 在开头恰好匹配一个星号,后跟一个空格,该空格将仅返回第一项。测试 4 匹配开头的一个星号或字符串中任意位置的星号后跟空格,这将导致向量中所有项目都匹配。您需要在|后使用^,以便在两种不同的模式之间进行选择作为第一个字符。但是,目前尚不清楚为什么这适用于您的问题,因为开头的 2 个星号不匹配。您可以使用纵梁 pacakge 中的"str_view_all"函数自己测试所有这些。您需要在*之前使用两个反斜杠,如果它们不在方括号中,则需要使用s

我建议使用以下方法:

library(stringr)
str_subset(string_vector,"^\*{1,2}[^*].+")

这匹配向量的所有元素,这些元素在开头"^\*{1,2}"正好有 1 或 2 个星号,并且不再有任何星号连接到原始的一两个星号[^*]。然后".+"表示任何其他字符都可以占据字符串的其余部分。

此命令提供所需的输出

[1] "* 11 13 24.574 1,474.79"  "** 11 13 24.574 1,474.79"

如果要对生成的矢量执行更多操作,可以分配给对象

object <- str_subset(string_vector,"^\*{1,2}[^*].+")

根据Cary Swoveland的有用评论进行编辑:

如果只是"**""*"也应该匹配,那么以下表达式应该有效。根据提供的数据,我假设一开始*后面总是会有更多的字符,但现在我看到描述中没有明确的陈述在逻辑上会导致这个假设。

object <- str_subset(string_vector,"^*(?!\*)|^\*{2}(?!\*)")

这将匹配:

  1. 一个*后不跟另一个*
  2. 两个*后面没有另一个*

(?!)表示负面的展望,即要匹配的字符(在本例中为 1 或 2*)不能紧接在(?!)之后括号中的字符之前(在这种情况下,另一个*\转义)。Cary 也正确地指出,由于我们只对字符串的开头方式感兴趣,因此在感兴趣的 1 或 2*之后是否还有更多字符并不重要。

这可能适合您:

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

测试字符串:

* 11 13 24.574 1,474.79
** 11 13 24.574 1,474.79
*** 11 13 24.574 1,474.79

模式:

^*{1,2}(?!*).*

最新更新