Java正则表达式:使用word选择整行,但如果存在一个或多个其他单词或模式,则不要选择该行
我有一个有许多列的表。一列是自由文本字段,即无集合结构,但我可以通过查看关键字、编写正则表达式选择整行并用更简单/更好的描述替换该行来提供顺序。下面4行是实际数据Java正则表达式:使用word选择整行,但如果存在一个或多个其他单词或模式,则不要选择该行,java,regex,select,word,ignore,Java,Regex,Select,Word,Ignore,我有一个有许多列的表。一列是自由文本字段,即无集合结构,但我可以通过查看关键字、编写正则表达式选择整行并用更简单/更好的描述替换该行来提供顺序。下面4行是实际数据 ************************************************************************ INVOICE·DID·NOT·MATCH·QUOTE·NEED·TO·DO·A·PARTIAL·CREDIT,·ALSO·NEED·TO·CREDIT·SHIPPING·CRATES·AN
************************************************************************
INVOICE·DID·NOT·MATCH·QUOTE·NEED·TO·DO·A·PARTIAL·CREDIT,·ALSO·NEED·TO·CREDIT·SHIPPING·CRATES·AND·REBILL·ON·A·SEPARATE·INVOICE
*************************************************************************
LUBRIZOL·RECEIVED·4·DV·THAT·BELONGED·TO·EXXON.·THEY·DID·NOT·RECEIVE·THE·CORRECT·VALVES·WE·CONTACTED·EXXON·TO·SEE·IF·THEY·COULD·F
*************************************************************************
MIL·SPEC·EPCC·SN:·000727·DID·NOT·ENERGIZE·WHEN·24V·WAS·APPLIED·PO·4500432166·DELIVERY·80794321·ORDER·498282
**************************************************************************
MISCOMMUNICATION·WITH·CUSTOMER·ABOUT·ORINGS.·THE·ONES·QUOTED·AND·SHIPPED·WERE·MADE·OUT·OF·SPECIAL·MATERIAL,·CUSTOMER·DID·NOT·NE
***************************************************************************
1) 所有行都包含“未包含””
2) 一行包含单词“客户”
目标:我想找到和所有包含“未”的行,然后取消选择包含“客户”的整行,只剩下三行
我有大量的行要清理,更改选择和取消选择关键字将使我在数据清理工作中有很大的能力
下面的正则表达式行将查找并选择任何带有“未”的行
注意:有两个星号(一个在句点后的开始处,一个在结尾处)被此编辑器删除
如何修改此行以实现上述目标
对于我最初的问题中出现的任何混乱,我深表歉意,我希望这篇最新的编辑文章能帮助我展示我正在努力实现的目标。我非常感谢在这方面的任何智慧。:) 我猜您可能正在设计一个类似以下内容的表达式:
^(?!.*\b(?:cat|dog)\b)(?=.*\b(?:thread|screw|bolt|tooling|machin|workman|incompl|craftsman|tolera|incorrec|too\s+wide|assembly|lathe)\S*\b).*$
或者可能有点接近这个
如果要探索/简化/修改该表达式,请在的右上面板中进行说明 试验
import java.util.regex.Matcher;
导入java.util.regex.Pattern;
最终字符串regex=“^(?)*(cat | dog))(?=.*\\b(?:螺纹|螺钉|螺栓|工具|机械|工人|不完整|工匠|公差|不正确|太\\s+宽|装配|车床)\\s*\\b.*$”;
final String=“thread\n”
+“线程\n”
+“未读\n”
+“螺钉\n”
+“螺钉\n”
+“工具前的一些单词\n”
+“som机器前的单词\n”
+“诺沃克曼\n”
+“非不完整\n”
+“太宽了,在那之后\n”
+“在CAT后面加上一些单词\n”
+“不正确”;
final Pattern=Pattern.compile(regex,Pattern.MULTILINE | Pattern.CASE|u不区分大小写);
final Matcher Matcher=pattern.Matcher(字符串);
while(matcher.find()){
System.out.println(“完全匹配:+matcher.group(0));
对于(inti=1;i沿着这条线的东西
(?m)^.*(?:CAT | DOG))(?=.*b(?:组装|螺栓|工匠| INCO(?:MPL | RREC)|车床|加工|螺钉| T(?:螺纹| O(?:LERA | O(?[]宽|灵)))|工人.*$
我没有数据来测试,哦,好吧
解释
(?m) # Multi-line mode if not already
^ # BOL
(?!
.*
(?: CAT | DOG ) # No CAT or DOG
)
(?= # Must have one of these keywords
.* \b
(?: # Trie of keywords
ASSEMBLY
| BOLT
| CRAFTSMAN
| INCO
(?: MPL | RREC )
| LATHE
| MACHIN
| SCREW
| T
(?:
HREAD
| O
(?:
LERA
| O
(?: [ ] WIDE | LING )
)
)
| WORKMAN
)
.* \b
)
.* # Have a keyword, just grab the line
$ # EOL
使用此正则表达式匹配包含“未”但不包含“客户”的行:
(?!*CUSTOMER)
是一个消极的前瞻,当锚定到start^
时,如果其中任何地方包含“CUSTOMER”,它将与行不匹配。在正则表达式的开头添加一个消极的前瞻:(?!*bCAT\b)
---如果字符串不包含单词CAT
Emma-jex.im,则匹配。我需要进一步探索该工具。图片显示,它在行的开头查找“CAT”和“DOG”。我希望取消选择/忽略与“CAT”或“DOG”匹配的行出现在线路中的任何地方。@Emma…我有奇怪的互联网连接,我无法测试您或SIN的解决方案。明天情况好转时,我会尝试一下。@SIN-以下是我感兴趣的线路示例:--在外活塞中安装活塞环之前,一个间隙袖珍阀已返还给客户。Clearance Ring measured。-----有几行被捕捉到带有关键字活塞和阀门,但因为单词RINGS包含在这一行中,所以必须排除它,即未选中。kill单词可以在这一行的任何地方。@Kevin-阅读我答案中的正则表达式时有问题吗?我不明白你的问题…添加新单词取决于你u、 而且它和你原来的帖子不一样!@SIN-我需要检查你的回复,看看我是否得到了我想要的东西。我在路上的时候,我的网络资源很不稳定。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
final String regex = "^(?!.*(cat|dog))(?=.*\\b(?:thread|screw|bolt|tooling|machin|workman|incompl|craftsman|tolera|incorrec|too\\s+wide|assembly|lathe)\\S*\\b).*$";
final String string = "thread\n"
+ "threads\n"
+ "nothread \n"
+ "screw\n"
+ "screws\n"
+ "some words before tooling\n"
+ "som words before machines DOG\n"
+ "noworkman\n"
+ "non-incomplete\n"
+ "too wide something after that\n"
+ "lathe some words after CAT\n"
+ "NOTincorrect";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
(?m) # Multi-line mode if not already
^ # BOL
(?!
.*
(?: CAT | DOG ) # No CAT or DOG
)
(?= # Must have one of these keywords
.* \b
(?: # Trie of keywords
ASSEMBLY
| BOLT
| CRAFTSMAN
| INCO
(?: MPL | RREC )
| LATHE
| MACHIN
| SCREW
| T
(?:
HREAD
| O
(?:
LERA
| O
(?: [ ] WIDE | LING )
)
)
| WORKMAN
)
.* \b
)
.* # Have a keyword, just grab the line
$ # EOL
^(?!.*CUSTOMER).*DID NOT.*$