正则表达式从可能使用不同语言的文本中获取名称和值

Regex grab name and value from a text that could be in a different languages

我正在尝试从此处的简短产品描述中提取规格名称和规格值:

Brand name: Lenovo‏, Model: IdeaPad 320‏, Size: 15.6''‏, CPU: Intel Core i3 - U‏, The Operating System: Free Dos‏, Capacity: 500GB‏, GPU: Intel‏, Memory Size: 4GB‏, Resolution: 1366x768‏, Optical Drive: DVD-RW (Dual Layer)‏, Color: Red‏, Connection Ports: HDMI‏, USB 3.0‏, USB Type-C‏, Features: HDD 5400RPM‏, Intel Skylake Processor‏, Full Keyboard‏, Bluetooth‏, Warranty: 1 Year‏,

我不太擅长正则表达式。我还是新手,但我尝试了以下模式。只有当我为该值添加另一个模式时,我才设法检测到规范名称,但由于不同的字符和可能性,它不适用于所有规范值。我想要实现的是:

  1. 选择完全匹配的规范名称和值。
  2. 让完整匹配的第一组包含规范名称,第二组包含规范值。

这是我做的图案,但只针对英文文本

((^[a-zA-Z]+|\s[a-zA-Z]+))+:( +[a-zA-Z0-9]+)

这里还有另一种语言的文本,希伯来语。文本应该从右到左阅读。

יצרן: Lenovo‏, דגם: IdeaPad 320‏, גודל: 15.6''‏, מעבד: Intel Core i3 - U‏, מערכת הפעלה: ללא מערכת הפעלה‏, נפח: 500GB‏, כרטיס מסך: Intel‏, גודל זכרון: 4GB‏, רזולוציה: 1366x768‏, כונן אופטי: (DVD-RW (Dual Layer‏, צבע: אדום‏, חיבורים: HDMI‏, USB 3.0‏, USB Type-C‏, תכונות: דיסק קשיח 5400Rpm‏, מעבד Skylake‏, מקלדת מלאה‏, Bluetooth‏, משך אחריות: שנה‏,

这似乎有效。我不确定希伯来语,但英语看起来不错。分解规范文本是基于 "spec name" 不包含逗号且规范值不包含冒号的假设。 (或许可以克服后者。)

public class Product {

  static String prodEng = "Brand name: Lenovo‏, Model: IdeaPad 320‏, Size: 15.6\"‏, CPU: Intel Core i3 - U‏, The Operating System: Free Dos‏, Capacity: 500GB‏, GPU: Intel‏, Memory Size: 4GB‏, Resolution: 1366x768‏, Optical Drive: DVD-RW (Dual Layer), Color: Red‏, Connection Ports: HDMI‏, USB 3.0‏, USB Type-C‏, Features: HDD 5400RPM‏, Intel Skylake Processor‏, Full Keyboard‏, Bluetooth‏, Warranty: 1 Year‏,";

  static String prodHeb = "יצרן: Lenovo‏, דגם: IdeaPad 320‏, גודל: 15.6''‏, מעבד: Intel Core i3 - U‏, מערכת הפעלה: ללא מערכת הפעלה‏, נפח: 500GB‏, כרטיס מסך: Intel‏, גודל זכרון: 4GB‏, רזולוציה: 1366x768‏, כונן אופטי: (DVD-RW (Dual Layer‏, צבע: אדום‏, חיבורים: HDMI‏, USB 3.0‏, USB Type-C‏, תכונות: דיסק קשיח 5400Rpm‏, מעבד Skylake‏, מקלדת מלאה‏, Bluetooth‏, משך אחריות: שנה‏,";

  private String specStr;
  private Map<String,String> specMap = new LinkedHashMap<>();
  private Pattern pat = Pattern.compile( "([^,]+?):\s*([^:]+)?,\s*" );

  public Product( String spec ){
    this.specStr = spec;
    decompose( this.specStr );
  }

  private void decompose( String s ){
    Matcher mat = pat.matcher( s );
    int pos = 0;
    while( mat.find( pos ) ){
      String key = mat.group( 1 );
      String val = mat.group( 2 );
      pos += mat.group( 0 ).length();
      specMap.put( key, val );
    }
  }

  public Map<String,String> getSpecs(){
    return specMap;
  }

  public static void main(String[] args) throws Exception {
    Product pe = new Product( prodEng );
    pe.getSpecs().forEach( (k, v) -> { System.out.println( k + ": " + v ); } );
    ph = new Product( prodHeb );
    ph.getSpecs().forEach( (k, v) -> { System.out.println( k + ": " + v ); } );
  }
}