Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在内容中的任何位置匹配模式?_Java_Regex - Fatal编程技术网

Java 在内容中的任何位置匹配模式?

Java 在内容中的任何位置匹配模式?,java,regex,Java,Regex,我有四种图案 值1xxx值2yyy 值1xxx值2bbb 值1aavalue2yyy 价值1AaaValue2BB 问题:我想当用户输入任何符合上述4种模式的内容时,我想检查Value1和Value2(Value1、Value2是示例;它可以是abc、xyz,用户输入的任何内容)。但问题是用户可以在内容中的任何位置键入,例如关于内容: Value1XXXValue2BBB Value3XXXValue4YYY any words in there Value5XXXValue6BBB a lin

我有四种图案

  • 值1xxx值2yyy
  • 值1xxx值2bbb
  • 值1aavalue2yyy
  • 价值1AaaValue2BB
  • 问题:我想当用户输入任何符合上述4种模式的内容时,我想检查Value1和Value2(Value1、Value2是示例;它可以是abc、xyz,用户输入的任何内容)。但问题是用户可以在内容中的任何位置键入,例如关于内容:

    Value1XXXValue2BBB
    Value3XXXValue4YYY any words in there Value5XXXValue6BBB
    a line there. and pattern here: Value7AAAValue8YYY
    ...
    
    我想在本文中捕获
    value1xxxvalue2bb
    value3xxvalue4yyy
    value5xxvalue6bbb
    Value7AAAValue8YYY

    我目前的模式是:

    (?: \ n * |. *) (?:. * \ s)? (. *?) (?: XXX | AAA) (?: \ s *) * (. *?) (?: YYY | BBB )
    
    但我的模式并没有抓住所有的模式


    我应该使用什么?

    我对java不是很在行,但这里有一个python的答案。也许一个java人可以移植到java,或者范·阮·杜伊(Van Nguyen Duy)可以从中直接理解

    #!/usr/bin/env python3
    
    import re
    
    xx_re = re.compile(r'''(.*?)?(XXX|AAA)(.*?)(YYY|BBB)''', re.M|re.S)
    
    matches = context_re.findall(line)
    
    for match in matches:
        print('found {}'.format(match))
    
    我们只需要匹配一对:

    contextXXXorAAAcontextYYYorBBB
    
    我们可以让正则表达式引擎找到输入中的所有对。re.findall在python中为我们实现了这一点

    在我的示例中,我发现模式前一行的所有字符都是该模式的上下文,因为我没有更好的规则可以遵循。该示例在您提供的输入中找到了所有案例。以下是我在交互式python会话中的测试运行:

    bjb@blueeyes:~/$ python3
    Python 3.5.3 (default, Sep 27 2018, 17:25:39) 
    [GCC 6.3.0 20170516] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import re
    >>> line = '''Value1XXXValue2BBB
    ... Value3XXXValue4YYY any words in there Value5XXXValue6BBB
    ... a line there. and pattern here: Value7AAAValue8YYY'''
    >>> context_re = re.compile(r'''(.*?)?(XXX|AAA)(.*?)(YYY|BBB)''', re.M|re.S)
    >>> matches = context_re.findall(line)
    >>> for match in matches:
    ...     print('found {}'.format(match))
    ... 
    found ('Value1', 'XXX', 'Value2', 'BBB')
    found ('\nValue3', 'XXX', 'Value4', 'YYY')
    found (' any words in there Value5', 'XXX', 'Value6', 'BBB')
    found ('\na line there. and pattern here: Value7', 'AAA', 'Value8', 'YYY')
    >>> 
    >>> 
    
    这个解决方案还包括上下文中的换行符,我认为OP希望排除这些换行符。。。我希望通过更好地说明如何定义每一对中的第一个“上下文”,这个问题将消失

    例如,如果第一个上下文是字母数字,则必须排除换行符和其他空格

    >>> context_re = re.compile(r'''([\S]+)(XXX|AAA)(.*?)(YYY|BBB)''', re.M|re.S)
    >>> matches = context_re.findall(line)
    >>> for match in matches:
    ...     print('found {}'.format(match))
    ... 
    found ('Value1', 'XXX', 'Value2', 'BBB')
    found ('Value3', 'XXX', 'Value4', 'YYY')
    found ('Value5', 'XXX', 'Value6', 'BBB')
    found ('Value7', 'AAA', 'Value8', 'YYY')
    >>> 
    

    但这可能过于简化。

    很难知道你在问什么。。。您说用户可以输入示例字符串之类的内容,并希望从中提取名称Value1、Value2等(regex中已知值前面的子字符串,“XXX”、“YYY”、“AAA”、“BBB”)。对吗?我们如何知道搜索的名称从何处开始和结束?例如,我们是否应该返回“Value5”,或“there Value5”,或“there Value5”或“anywords in there Value5”?另外,您在正则表达式中使用什么语言或工具?正则表达式可能会因工具或语言的不同而有所不同。在对这个问题进行进一步的研究之后,我猜您是想问:您想找到所有值为XXX、YYY、AAA和BBB的字段名。字段名始终是一个单词(没有空格或标点符号,严格由[a-Za-z0-9]组成,并在已知值之前给出(没有中间空格或其他字符))。输入可以是多行的,但字段名和关联值永远不会被换行分隔。在您给出的示例中,字段名为Value1、Value2、。。。价值8。输入中可以有任意数量的字段名/值对。@BrendaJ.Butler谢谢你的评论,我英语不好,所以很难理解我的问题。很抱歉,我想在一个内容(文本)中找到我的模式,例如:用户输入一个文本,比如我的示例,我想在这个文本中找到catch value1xvalue2yyy、value3xxvalue4yyy、value5xxvalue6yyy和value7xxvalue8yy。我将使用您评论中的术语重新表述我的评论。您希望在某些已知模式每次出现之前找到文本上下文,这些模式总是成对出现的。模式XXX或AAA将首先出现,然后YYY或BBB将第二次出现。XXXorAAA和yyyorbb之间的文本将作为yyyorbb的上下文。现在最困难的部分是确定XXXorAAA的上下文。遗憾的是,java还不是我的语言之一。其他人将不得不从这里拿走它。但希望这个问题已经足够精炼,可以快速给出答案。您可能想在问题中添加一个“java”标记。非常感谢,它与我一起工作:3,我还发现另一个正则表达式可以适合我的4种模式:\b(\w+)(:XXX | AAA)(?:\s*)(\w+)(:YYY | BBB)太棒了