我正在尝试找出正则表达式以匹配*this kind of strings*
的所有出现。不幸的是,另外两个规则使这件事比我想象的要复杂:
*
开头,后跟非空格字符(因此* this one*
不应该匹配*
,后跟空格(因此,*this one *
和*this o*ne
不应该匹配我从最简单的正则表达式\*\S([^\*]+)?\*
开始,它是我的测试字符串:
*foo 1 * 2 bar* foo *b* azz *qu **ux*
匹配方括号中的位置:
[*foo 1 *] 2 bar* foo [*b*] azz [*qu *][*ux*]
这就是我想要实现的:
[*foo 1 * 2 bar*] foo [*b*] azz [*qu **ux*]
所以出现2个问题:
*
,然后出现空白”?积极向前看?\*\S([^\*]+)?\*\s
会这样做吗?答案 0 :(得分:2)
如果要从最右边 *
开始匹配,则可以使用
\*(?=[^\s*]).*?(?<=[^\s*])\*(?!\S)
要从最左边的*
开始匹配(如“”所示),请从第一次环视中删除*
(或用\S
替换其模式):>
\*(?=\S).*?(?<=[^\s*])\*(?!\S)
请参见regex demo #1和regex demo #2。在开头添加(?s)
或使用Pattern.DOTALL
进行编译以匹配多行文本。
详细信息
\*
-一个*
字符(?=[^\s*])
-下一个字符必须是非空格,而不是*
.*?
-尽可能少包含0个字符(?<=[^\s*])
-前面的字符应该是非空格,而不是*
\*
-一个*
字符(?!\S)
-空格边界模式,下一个字符可以是空格,或者字符串的结尾可以在字符串的此位置。在Java中:
String regex = "\\*(?=[^\\s*]).*?(?<=[^\\s*])\\*(?!\\S)";
答案 1 :(得分:1)
您可以使用this正则表达式:
\*(?!\s)(.*?)(?<!\s|\*)\*(?=\s|$)
如何在正则表达式中表达从2开始的规则:“搜索直到出现第一个非空白,然后是*,然后出现空白”?积极向前看?
只有当非星号前面有一个非空格字符时,您才可以使用负向后匹配该星号,而当其后接一个空格字符或字符串末尾时,则可以使用正向匹配该星号。
如何匹配规则2中的空格,但不将其包括在结果中,* \ S([^ *] +)?* \ s可以做什么?
如果您要检查pattern
后是否有一个字符而不消耗它,可以使用先行方式,例如pattern(?=\s)
不会消耗\s
而不是pattern\s
。
答案 2 :(得分:0)
我使用完全匹配而不是分组,它与您的测试字符串完美匹配:
"(?<=\\s|^)\\*(?:\\S|\\S.*?\\S)\\*(?=\\s)"
答案 3 :(得分:0)
re = /(.+?)\/(\s.+)(\/.+)/m
str = 'hello/there/ hello/there/friend'
subst = '$1$2'
result = str.gsub(re, subst)
# Print the result of the substitution
puts result
* \ S :*后跟非空格字符
。*?:非贪婪地消费字符。
(?<!\ s)* :*后跟非空白字符。这是负面的表情 后面,它不会消耗非空格字符。
(?= \ s | $):正向。 *后接空格或 行尾。