如何使用正则表达式提取成员

时间:2017-04-25 14:54:41

标签: java regex

我有这个字符串来解析并提取<>:

之间的所有元素
String text = "test user #myhashtag <@C5712|user_name_toto> <@U433|user_hola>";

我试过这种模式,但它不起作用(没有结果):

String pattern = "<@[C,U][0-9]+\\|[.]+>";

所以在这个例子中我想提取:

  • <@C5712|user_name_toto>
  • <@U433|user_hola>

然后对于每一个,我想提取:

  • CU元素
  • ID(即:5712433
  • 用户名(即:user_name_toto

非常感谢你们

2 个答案:

答案 0 :(得分:4)

  • 我可以看到你的模式的主要问题是它不包含组,因此如果没有进一步解析,检索它的一部分将是不可能的。

您可以在括号内定义编号组:(partOfThePattern)。 从Java 7开始,您还可以按如下方式定义命名组:(?<theName>partOfThePattern)

  • 第二个问题是[.]对应于文字点,而不是“任何字符”通配符。
  • 第三个问题是你的上一个量词,它是贪婪的,因此它将从第一个用户名开始消耗整个字符串的其余部分。

以下是修复所有内容的独立示例:

String text = "test user #myhashtag <@C5712|user_name_toto> <@U433|user_hola>";
//                            | starting <@
//                            | | group 1: any 1 char
//                            | |  | group 2: 1+ digits 
//                            | |  |     | escaped "|"
//                            | |  |     |   | group 3: 1+ non-">" chars, greedy
//                            | |  |     |   |       | closing >
//                            | |  |     |   |       | 
Pattern p = Pattern.compile("<@(.)(\\d+)\\|([^>]+))>");
Matcher m = p.matcher(text);
while (m.find()) {
        System.out.printf(
            "C or U? %s%nUser ID: %s%nUsername: %s%n", 
            m.group(1), m.group(2), m.group(3)
        );
}

<强>输出

C or U? C
User ID: 5712
Username: user_name_toto
C or U? U
User ID: 433
Username: user_hola

注意

我在这里没有验证C vs U(给你另一个.示例)。

如果您只有(.),则可以轻松将(C|U)替换为([CU])。您也可以使用 protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) { base.OnActivityResult(requestCode, resultCode, data); // Make it available in the gallery try { Intent mediaScanIntent = new Intent(Intent.ActionMediaScannerScanFile); Uri contentUri = Uri.FromFile(App._file); mediaScanIntent.SetData(contentUri); SendBroadcast(mediaScanIntent); // Display in ImageView. We will resize the bitmap to fit the display. // Loading the full sized image will consume to much memory // and cause the application to crash. int height = Resources.DisplayMetrics.HeightPixels; int width = imageView.Height; App.bitmap = App._file.Path.LoadAndResizeBitmap(width, height); if (App.bitmap != null) { imageView.SetImageBitmap(App.bitmap); App.bitmap = null; } // Dispose of the Java side bitmap. GC.Collect(); } catch { } try { if (resultCode == Result.Ok) { var imageView = FindViewById<ImageView>(Resource.Id.imageView1); imageView.SetImageURI(data.Data); } } catch { } }

答案 1 :(得分:1)

<@([CU])(\d{4})\|(\w+)>

其中:

$ 1 - &gt; C / U

$ 2 - &gt; 433分之5712

$ 3 - &gt; user_name_toto / user_hola