需要验证一个单词的开头是否有一个或最多两个星号,从三个开始,它应该忽略它们。
字数:
[
'* 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*
)不能紧接在(?!)
之后括号中的字符之前(在这种情况下,另一个*
用\
转义)。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}(?!*).*