0

这个必须加上它后面的空格像这样的

也必须使用 如果这个像 \gloss{word}, \(anything here)sezione{word}, \gloss{anything word any), \(这里的任何东西)sezione{anything word any },绝对不能被拿走。
如果里面的像 \(anything but gloss or sezione){ word } 和 \{anything but gloss or sezione){strings word strings} 它必须被采用。
显然 aword、worda 和 aworda 都不能取。

粗体字已取,字未取)

我无法捕捉到“{.... word .....}”中的单词

(?<!(sezione\{)|(gloss\{))(\b)( ?)word(\b)(?!.*\{})到目前为止,我的猜测是,我会在后视和前瞻 ( (?<!(sezione\{)|(gloss\{).*)[...]) 上添加一个“.*”,但这样它就停止工作了。

如果这件事,我打算使用Java的正则表达式引擎

提前致谢

编辑:主要问题是

\(这里的任何东西)sezione{任何字词任何东西}

如果我不能得到这个,这应该可以解决整个问题

4

1 回答 1

1

让我们为您的用例设置一些确凿的事实:

  1. Java(和大多数)正则表达式引擎不支持可变长度的lookbehind
  2. Java 正则表达式引擎不支持\K允许您重置搜索的模式

如果没有,您将需要使用分三步工作的解决方法:

  1. 确保输入与预期匹配lookbehind pattern
  2. 如果确实如此,则删除匹配的字符串lookbehind pattern
  3. 在替换的字符串匹配中提取您的搜索模式

考虑以下代码:

String str = "(anything here)sezione{anything word anything}";
// look behind pattern
String lookbehind = "^.*?(?:sezione|gloss|word)\\{";
// make sure input is matching lookbehind pattern first
if (str.matches(lookbehind + ".*$")) {
        // actual search pattern
    Pattern p = Pattern.compile("[^}]*?\\b(word)\\b");
        // search in replaced String
    Matcher m = p.matcher(str.replaceFirst(lookbehind, ""));
    if (m.find())
        System.out.println(m.group(1));
        //> word
}

PS:您可能需要通过检查输入字符串中的索引作为搜索模式的起点来改进代码。

于 2013-11-07T15:02:48.333 回答