如何创建适当的正则表达式以查找我想要的最后一个字符?

时间:2019-04-19 22:29:44

标签: regex regex-group

我需要创建正则表达式以找到像012344_2.0224.71_3012354_5.00123.AR_3.335_8这样的字符串中的最后一个下划线

我想用表达式[^.]+$找到最后一部分,然后在found元素下找到下划线,但我无法处理。

希望您能帮助我:)

4 个答案:

答案 0 :(得分:1)

只需使用一个负字符类[^_]即可匹配除下划线以外的所有字符(这有助于确保之后没有其他下划线)和字符串$的结尾

模式看起来像这样:

(_)[^_]*$

最后的下划线_在捕获组中,因此您希望返回子匹配项。您将替换组1(您的下划线)。

实时观看:Regex101

请注意Regex101上绿色突出显示的部分,这是您的子匹配项,将被替换。

答案 1 :(得分:0)

如果您只想要“ net”(即除最后一个下划线外没有其他匹配项),请使用正向超前检查以确保字符串中不再有下划线:

/_(?=[^_]*$)/gm

Demo

答案 2 :(得分:0)

我能想到的最简单的解决方案是使用.*\K_,但是并非所有的正则表达式都支持\K

否则,另一个想法是使用_(?=[^_]*$)

您有一个firstsecond选项的演示。

说明:

.*\K_:获取所有字符,直到下划线为止。由于*量词是贪婪的,它将一直匹配到最后一个下划线。然后\K放弃之前的匹配,然后我们匹配下划线。

_(?=[^_]*$):获取非下划线字符开头的下划线,直到该行的末尾

答案 3 :(得分:0)

模式LoginRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { long totalusers = dataSnapshot.getChildrenCount(); final long userid = 100000 + totalusers; Random random = new Random(); int n = random.nextInt(); final String password = String.valueOf(userid).concat(String.valueOf(n)); HashMap usermap = new HashMap(); usermap.put("fullname", name); usermap.put("phonenumber", phoneNumber); usermap.put("sponsorid", sponsorId); usermap.put("emailid", emailId); usermap.put("userid", userid); UsersRef.child(String.valueOf(userid)).updateChildren(usermap).addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { if (task.isSuccessful()) { HashMap loginmap = new HashMap(); loginmap.put("password", password); LoginRef.child(String.valueOf(userid)).updateChildren(loginmap).addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { if (task.isSuccessful()) { SendUserToUsersActivity(); Toast.makeText(AddUserActivity.this, "User Added", Toast.LENGTH_LONG).show(); } else { String message = task.getException().getMessage(); Toast.makeText(AddUserActivity.this, "Error: " + message, Toast.LENGTH_SHORT).show(); } } }); } else { String message = task.getException().getMessage(); Toast.makeText(AddUserActivity.this, "Error: " + message, Toast.LENGTH_SHORT).show(); } } }); } @Override public void onCancelled(@NonNull DatabaseError databaseError) { } }); 不匹配点超过1次,然后断言字符串的结尾。将会为您提供[^.]+$71_3

的匹配项

当不再有下划线时,您要匹配的是下划线。

一种方法是使用否定的前行335_8(如果支持的话则断言右边的字符与下划线后跟的任何字符都不匹配)

(?!.*_)

Pattern demo