नियमित अभिव्यक्ति से मेल करने के लिए पूर्णांक शाब्दिक

0

सवाल

मैं सोच रहा था के बारे में पार्स पूर्णांकों की एक सूची (एक संपत्ति से स्ट्रिंग). हालांकि, मैं होगा की तरह से परे जाने के लिए सिर्फ सकारात्मक और नकारात्मक दशमलव मूल्यों और पार्स किसी भी स्ट्रिंग इंगित करता है कि एक जावा पूर्णांक शाब्दिक (JLS 17) के रूप में पाया जा सकता है स्रोत कोड. इसी तरह, मैं चाहते करने के लिए उदार होने के लिए संबंध के साथ किसी भी उपसर्ग, विभाजक और परिशिष्ट के आसपास integers खुद को. दूसरे शब्दों में, मैं करना चाहते हैं खोजने के लिए उन्हें का उपयोग कर दोहराया कॉल करने के लिए Matcher.find().

वहाँ है एक नियमित अभिव्यक्ति से मेल खाता है कि सभी संभव जावा पूर्णांक literals? यह नहीं करता है की जरूरत है की जांच करने के लिए ऊपरी और निचले सीमा.


यहां तक कि हालांकि मैं था स्पष्ट रूप से लिंक करने के लिए JLS, मैं दिखाता हूँ कुछ मान्य और अमान्य संख्या:

  • -1में : 1 मिलान किया जाता है, लेकिन शून्य से एक एकल ऑपरेटर (मैं हूँ समायोजित यदि आवश्यक हो तो)
  • 0x00_00_00_0F: मूल्य पंद्रह मिलान किया जाता है के रूप में हेक्स अंक, एक अंडरस्कोर के साथ करने के लिए दो अलग-अलग nibbles
  • 0b0000_1111: मूल्य पंद्रह में द्विआधारी मिलान किया जाता है
  • 017: यथार्थ का मूल्य पंद्रह मिलान किया जाता है
integer java literals regex
2021-11-23 21:48:28
3

सबसे अच्छा जवाब

4

कुछ की तरह है कि:

दशमलव:
(?:0|[1-9](?:_*[0-9])*)[lL]?

हेक्साडेसिमल:
0x[a-fA-F0-9](?:_*[a-fA-F0-9])*[lL]?

अष्टाधारी:
0[0-7](?:_*[0-7])*[lL]?

बाइनरी:
0[bB][01](?:_*[01])*[lL]?

सब एक साथ: (में freespacing मोड)

(?:
    0
    (?:
        x [a-fA-F0-9] (?: _* [a-fA-F0-9] )*
      |
        [0-7] (?: _* [0-7] )*
      |
        [bB] [01] (?: _* [01] )*
    )?
  |
    [1-9] (?: _* [0-9] )*
)
[lL]?

यह परीक्षण

2021-11-23 22:47:19

आह, हाँ, मुझे मिल जाएगा कि एक लंबा रास्ता. यह अनुमति कई को रेखांकित करता है, हालांकि? हो सकता है कि ? होना चाहिए *?
Maarten Bodewes

@MaartenBodewes: के रूप में मैं समझता हूँ डॉक्टर, रेखांकित कर रहे हैं नहीं होना चाहिए contigous, लेकिन शायद मैं मैडम गलत? (दूसरे शब्दों में है 1____1 की अनुमति है ?). ध्यान दें कि समूह के अंदर जो वैकल्पिक अंडरस्कोर है, है अंत में दोहराया.
Casimir et Hippolyte

हुह कर सकते हैं, किसी को फिर से लिखना है कि regex? मुझे लग रहा था करने में सक्षम हो सकता है यह अद्यतन करने के लिए (परीक्षण संस्करण अभी भी था ? के बजाय *)....
Maarten Bodewes

एक बार फिर धन्यवाद, मैं पोस्ट किया है एक जवाब है कि डेसिमल पूर्णांक के रूप में अच्छी तरह का उपयोग कर नियमित अभिव्यक्ति वाक्य रचना में स्थित आत्मा पर अपने regex.
Maarten Bodewes
0

जवाब के बाद से Casimir मैं इसे लेने का फैसला किया एक सा आगे और लागू करने के लिए कुछ कोड वास्तव में पार्स integers के रूप में अच्छी तरह से, नीचे शामिल है. यह शामिल करता है ऋण और प्लस प्रतीकों यहां तक कि हालांकि वे कर रहे हैं आधिकारिक तौर पर हिस्सा नहीं के पूर्णांक शाब्दिक रूप में वर्णित JLS; वे कर रहे हैं एकल ऑपरेटरों.

package nl.owlstead.ifprops;

import java.math.BigInteger;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public final class JavaIntegerParser {
    private static final Pattern BINARY = Pattern.compile("(0b)([01](?:_*[01])*)(L?)", Pattern.CASE_INSENSITIVE);
    private static final Pattern OCTAL = Pattern.compile("(0)([0-7](?:_*[0-7])*)(L?)", Pattern.CASE_INSENSITIVE);
    private static final Pattern DECIMAL = Pattern.compile("()(0|(?:[1-9](?:_*[0-9])*))(L?)", Pattern.CASE_INSENSITIVE);
    private static final Pattern HEXADECIMAL = Pattern.compile("(0x)([0-9a-f](?:_*[0-9a-f])*)(L?)", Pattern.CASE_INSENSITIVE);
   
    // NOTE: OCTAL should be before DECIMAL if this is used to find the pattern
    private static final Pattern SIGNED_INTEGER_LITERAL = Pattern.compile(
            "(?:([+-])\\s*)?(" + 
            BINARY + "|" + OCTAL + "|" + DECIMAL + "|" + HEXADECIMAL + 
            ")", Pattern.CASE_INSENSITIVE);
        
    public static int parseJavaInteger(String javaInteger) throws NumberFormatException {
        BigInteger value = parseIntegerAsBigInt(javaInteger);
        try {
            return value.intValueExact();
        } catch (@SuppressWarnings("unused") ArithmeticException e) {
            throw new NumberFormatException("Number is not between Integer.MIN_VALUE and Integer.MAX_VALUE");
        }
    }
    
    public static long parseJavaLong(String javaLong) throws NumberFormatException {
        BigInteger value = parseIntegerAsBigInt(javaLong);
        try {
            return value.longValueExact();
        } catch (@SuppressWarnings("unused") ArithmeticException e) {
            throw new NumberFormatException("Number is not between Integer.MIN_VALUE and Integer.MAX_VALUE");
        }
    }

    private static BigInteger parseIntegerAsBigInt(String javaLiteral) {
        Matcher intMatcher = SIGNED_INTEGER_LITERAL.matcher(javaLiteral);
        if (!intMatcher.matches()) {
            throw new NumberFormatException(javaLiteral + " is not recognized as a Java integer literal");
        }
        
        String signGroup = intMatcher.group(1);
        String prefixAndValueGroup = intMatcher.group(2);
        String radixGroup = "";
        String valueGroup = "";
        // String longGroup = "";
        List<Pattern> patterns = List.of(BINARY, OCTAL, DECIMAL, HEXADECIMAL);
        for (Pattern pattern : patterns) {
            Matcher specificMatcher = pattern.matcher(prefixAndValueGroup);
            if (specificMatcher.matches()) {
                radixGroup = specificMatcher.group(1);
                valueGroup = specificMatcher.group(2);
                // longGroup = specificMatcher.group(3);
                break;
            }
        }
        
        if (valueGroup == null) {
            throw new RuntimeException("Number both matches but doesn't contain a value (parser error)");
        }

        BigInteger sign = signGroup != null && signGroup.matches("-") ? BigInteger.ONE.negate() : BigInteger.ONE; 
        
        int radix;
        switch (radixGroup.toLowerCase()) {
        case "0b":
            radix = 2;
            break;
        case "0":
            radix = 8;
            break;
        case "":
            radix = 10;
            break;
        case "0x":
            radix = 16;
            break;
        default:
            throw new RuntimeException();
        }
 
        BigInteger value = new BigInteger(valueGroup.replaceAll("_", ""), radix).multiply(sign);
        return value;
    }
}

मैं भी करने की कोशिश की करने के लिए उपयोग कोड को खोजने के लिए कई integers से एक स्ट्रिंग है, लेकिन है कि नहीं था अच्छी तरह से जाना. समस्या यह है कि कुछ अमान्य literals के रूप में इस तरह 0__0 स्वीकार कर लिया गया के रूप में दो literals के साथ मूल्य शून्य; नहीं बिल्कुल आप क्या चाहते हैं. तो कृपया का उपयोग करें regex केवल अगर पता लगाने के लिए एक स्ट्रिंग वास्तव में है एक पूर्णांक के लिए और अलग पूर्णांकों का उपयोग कर उदाहरण के लिए String.split(SEPARATOR_REGEX).

अजीब बात है पर्याप्त, मेरे ग्रहण आईडीई स्वीकार किया 0__0 के रूप में एक शाब्दिक यहां तक कि अगर यह आधिकारिक तौर पर है नहीं करने के लिए अनुरूप JLS. नहीं एक biggy है, लेकिन अजीब कोई नहीं-the-कम.

2021-11-23 22:27:00

जल्दी से अपने जवाब है, खेद भी थक जाने के लिए और अधिक गहरा है, लेकिन देखभाल करने के लिए नहीं का उपयोग बहुत ज्यादा कब्जा विशेष रूप से यदि उन्हें जरूरत नहीं है. उपयोग गैर-समूहों पर कब्जा (?:....) (कब्जा एक लागत है).
Casimir et Hippolyte

मैं का उपयोग करते हैं, गैर-कैप्चरिंग समूहों जहां संभव हो. शायद मान्य करने के लिए पूरे पूर्णांक मैं निकाल सकता है कुछ है, मैं उन्हें जरूरत नहीं है के लिए प्रारंभिक मैच. या शायद मैं निकाल सकता है पूरे प्रारंभिक मैच और बस छोड़ पाश पुष्टि की है कि सभी संभव प्रारूपों । लेकिन हे, अंत में हम कोशिश कर रहे हैं से मेल करने के लिए integers, नहीं पृष्ठों और पाठ के पन्नों पर...
Maarten Bodewes
-1

खैर.... सरल शब्दों में, बेस 2, 8, और 10 नंबर सकता है का उपयोग करें एक ही पैटर्न के बाद से उनके मूल्यों रहे हैं सभी संख्यात्मक अक्षर. लेकिन, आप शायद चाहते हैं कि एक अभिव्यक्ति के प्रत्येक प्रकार के लिए. समस्या यह है कि आप स्पष्ट नहीं किया अपने इरादे. मैं पर जा रहा हूँ धारणा है कि आप चाहते हैं की अभिव्यक्ति को मान्य करने के लिए क्या आधार पर एक विशेष मूल्य है.

String base10Regex = "[0-9]+";
String base2Regex = "[0-1]+";
String base8Regex = "[0-7]+";
String base16Regex = "^[0-9A-F]+$";

के लिए अष्टाधारी, और दशमलव मान, आप की आवश्यकता होगी करने के लिए पहले जोड़ें अपनी अभिव्यक्ति की जांच करने के लिए एक वैकल्पिक साइन चरित्र "^[\\+|-]?". के लिए हेक्स मान, अगर आप की उम्मीद करने के लिए मूल्यों के साथ शुरू "0x", मैं सुझाव है कि करने के लिए पहले जोड़ें अभिव्यक्ति के साथ उन शाब्दिक मूल्यों.

2021-12-09 23:34:58

कोई रेखांकित करता है और यह मैच नहीं करता है वास्तविक integers. और पाठ्यक्रम की सीमाओं (^$होता है ) के साथ काम नहीं लगता है, लेकिन यह एक शुरुआत है...
Maarten Bodewes

@MaartenBodewes धन्यवाद. मैं तुम्हें अनुदान को रेखांकित करता है, लेकिन क्या आप का मतलब यह नहीं है मैच वास्तविक integers? इसके अलावा, मुझे नहीं पता था कि सीमाओं के साथ काम नहीं करते find. तो, तुम उस के लिए धन्यवाद के रूप में अच्छी तरह से.
hfontanez

क्षमा करें, मेरा बुरा है, मैं मतलब नहीं है कि यह मैच literals में संकेत के रूप में JLS, जहाँ आप करने के लिए की जरूरत है 0x या 0X के लिए hexadecimals आदि ।
Maarten Bodewes

@MaartenBodewes छोड़कर मैं लिखा है " अगर आप की उम्मीद करने के लिए मूल्यों के साथ शुरू "0x", मैं सुझाव है कि करने के लिए पहले जोड़ें अभिव्यक्ति के साथ उन शाब्दिक मूल्यों"
hfontanez

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में