正则表达式问题 - 排除特定字符

4
如果我想在正则表达式中排除 /*,应该如何编写?
我已经尝试过以下代码:
[^/[*]]
([^/][^*])

但是却毫无效果...

您能提供更多细节吗?您期望什么样的输入?应该捕获/匹配什么,又不应该捕获/匹配什么? - bdukes
使用哪种编程语言/正则表达式风格? - Matt Ball
@ Matt Ball - 抱歉,我正在使用Java。这是与这篇文章有关的,这让我感到疯狂 - http://stackoverflow.com/questions/5937504/regex-question-newbie - user559142
1
在未来的正则表达式问题中,请务必指定编程语言/正则表达式风格。 - Matt Ball
顺便说一句,我发现这个页面对于Java正则表达式是一个有用的工具:http://www.regexplanet.com/simple/。 - Matt Ball
5个回答

3

您必须匹配not /,或者/后跟not *

([^/]|/[^*])+/?

为什么正则表达式不能匹配 / 字符? - Matt Ball
1
不,这是个技巧。你匹配除了 / 或者 / 后面跟着的不是 * 的任何字符。 - orlp
能不能一步到位呢?比如说,直接忽略掉那些 /*? - user559142
1
但是这将无法匹配字符串末尾的 / - Bart Kiers

2
使用负向先行断言来检查输入是否包含/,如果包含,则不包含/后面跟着/*。在JavaScript中,x不跟随y的写法是x(?!y),因此:
  • 要么输入不包含/new RegExp('^[^/]*$'),或者
  • 任何发现的/都不能后跟*new RegExp('^/(?!\\*)$')(请注意,*必须用\\转义,因为*是一个特殊字符。

要结合这两个表达式:

new RegExp('^([^/]|/(?!\\*))*$')

我尝试了这个,但它不起作用... 它只捕获独立的 / 字符,而不获取其他任何内容。从问题中可以看出,他想要除此之外的所有内容。 - eykanal

0

在Java中,以下模式应该适用于您:

Pattern pt = Pattern.compile("((?<!/)[*])");

这意味着匹配 *,但它之前没有出现 /

测试代码

String str = "Hello /* World";
Pattern pt = Pattern.compile("((?<!/)[*])");
Matcher m = pt.matcher(str);
if (m.find()) {
    System.out.println("Matched1: " + m.group(0));
}
String str1 = "Hello * World";
m = pt.matcher(str1);
if (m.find()) {
    System.out.println("Matched2: " + m.group(0));
}

输出

Matched2: *

0

你不能否定一个正匹配吗?所以内核只是“/*”,但*需要通过反斜杠进行掩码处理,这本身需要进行掩码处理,并且模式可能会在前面或后面跟随某些内容,因此需要在/\\*之前和之后加上.*:".*/\\*.*"

val samples = List ("*no", "/*yes", "yes/*yes", "yes/*", "no/", "yes/*yes/*yes", "n/o*")  
samples: List[java.lang.String] = List(*no, /*yes, yes/*yes, yes/*, no/, yes/*yes/*yes, n/o*)

scala> samples.foreach (s => println (s + "\t" + (! s.matches (".*/\\*.*"))))                   
*no true
/*yes   false
yes/*yes    false
yes/*   false
no/ true
yes/*yes/*yes   false
n/o*    true

-1

OP已经知道了否定字符类,但它们并不能解决问题。 - Alan Moore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接