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
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)太棒了